百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

java短信验证平台_JAVA实现利用第三方平台发送短信验证码

ztj100 2025-03-24 22:45 13 浏览 0 评论

一、前期准备工作

支付宝支付分为正式环境和沙箱环境,我这里使用的是正式环境。

沙箱环境和正式环境差距不是很大,唯一的差距就是正式环境需要营业执照。沙箱环境就可以很好避免这个问题。

创建应用

绑定应用

配置秘钥

上线应用

签约功能

官方API文档地址:
https://opendocs.alipay.com/open/270/01didh?ref=api

二、导入依赖

com.alipay.sdk

alipay-sdk-java

4.23.0.ALL

1

2

3

4

5

6

三、书写配置类

/**

* description:支付宝支付配置类

* author:maozl

* date:2022/8/1

*/

@Configuration

@PropertySource("
classpath:alipay.properties") //读取配置文件

@ConfigurationProperties(prefix="alipay") //读取wxpay节点

@Data //使用set方法将alipay节点中的值填充到当前类的属性中

@Slf4j

public class AliPayClientConfig {

/**

* APPID

*/

private String appId;

/**

* 商户PID

*/

private String sellerId;

/**

* 支付宝网关

*/

private String gatewayUrl;

/**

* 商户私钥

*/

private String merchantPrivateKey;

/**

* 支付宝公钥

*/

private String aliPayPublicKey;

/**

* 接口加密秘钥

*/

private String contentKey;

/**

* 页面跳转同步通知页面路径

*/

private String returnUrl;

/**

* 回调地址

*/

private String notifyUrl;

@Bean

public AlipayClient alipayClient() throws AlipayApiException {

AlipayConfig alipayConfig=new AlipayConfig();

//设置appId

alipayConfig.setAppId(appId);

//设置商户私钥

alipayConfig.setPrivateKey(merchantPrivateKey);

//设置支付宝公钥

alipayConfig.setAlipayPublicKey(aliPayPublicKey);

//设置支付宝网关

alipayConfig.setServerUrl(gatewayUrl);

//设置请求格式,固定值json.

alipayConfig.setFormat(AlipayConstants.FORMAT_JSON);

//设置字符集

alipayConfig.setCharset(AlipayConstants.CHARSET_UTF8);

//设置签名类型

alipayConfig.setSignType(AlipayConstants.SIGN_TYPE_RSA2);

//构造client

AlipayClient alipayClient=new DefaultAlipayClient(alipayConfig);

return alipayClient;

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

四、书写配置文件

# 支付宝支付相关参数

# 应用ID,你的APPID

alipay.app-id=

# 商户PID

alipay.seller-id=

# 支付宝网关

alipay.gateway-url=

# 商户私钥

alipay.merchant-private-key=

# 支付宝公钥

aliPay.aliPay-public-key=

# 接口内容加密秘钥,对称秘钥

alipay.content-key=

# 页面跳转同步通知页面路径

alipay.return-url=

# 支付宝支付成功回调地址

alipay.notify-url=

五、调用相关支付接口

1.流程图

2.创建支付

https://opendocs.alipay.com/apis/028r8t?scene=22

/**

* 发起支付

* @param orderNo

* @param uid

* @return

*/

@Override

public String createPay(String orderNo, String uid) {

//根据orderNo获取orderInfo

OrderInfo orderInfo = orderInfoService.getOne(new LambdaQueryWrapper()

.eq(OrderInfo::getOrderNo, orderNo)

.eq(OrderInfo::getUid, uid));

if (Objects.isNull(orderInfo)){

throw new ServiceErrorException(ResultCode.ERROR, "发起支付请求失败 - 订单不存在");

}

//更新订单的支付类型

orderInfoService.updatePayTypeByOrderNo(orderInfo.getOrderNo(), PayType.ALIPAY);

//创建支付宝请求对象

AlipayTradePagePayRequest request=new AlipayTradePagePayRequest();

//数据

AlipayTradePagePayModel bizModel=new AlipayTradePagePayModel();

bizModel.setOutTradeNo(orderInfo.getOrderNo());

//单位是元

bizModel.setTotalAmount(orderInfo.getTotalFee().toString());

bizModel.setSubject(orderInfo.getTitle());

//默认的

bizModel.setProductCode("FAST_INSTANT_TRADE_PAY");

request.setBizModel(bizModel);

request.setNotifyUrl(aliPayClientConfig.getNotifyUrl());

//用户支付后支付宝会以GET方法请求returnUrl,并且携带out_trade_no,trade_no,total_amount等参数.

request.setReturnUrl(aliPayClientConfig.getReturnUrl());

AlipayTradePagePayResponse response=null;

try{

//完成签名并执行请求

response=alipayClient.pageExecute(request);

if(response.isSuccess()){

log.debug("支付宝支付 - 调用成功");

return response.getBody();

}

else{

log.error("支付宝支付 - 调用失败");

log.error(response.getMsg());

return null;

}

}

catch(AlipayApiException e){

log.error("支付宝支付 - 创建支付交易失败");

throw new ServiceErrorException(ResultCode.ERROR, "支付宝支付 - 创建支付交易失败");

}

}

3.支付通知

https://opendocs.alipay.com/open/270/105902

/**

* 支付成功回调函数

* @param params

* @return

*/

@PostMapping("/callback")

public String callback(@RequestParam Map params){

log.debug("收到支付宝回调");

try{

//验签

boolean signVerified = AlipaySignature.rsaCheckV1(params,

aliPayClientConfig.getAliPayPublicKey(),

AlipayConstants.CHARSET_UTF8,


AlipayConstants.SIGN_TYPE_RSA2) ; //调用SDK验证签名

//验签成功

if(signVerified){

log.debug("验签成功");

//1.商家需要验证该通知数据中的 out_trade_no 是否为商家系统中创建的订单号

String orderNo = params.get("out_trade_no");

OrderInfo orderInfo = orderInfoService.getOrderByOrderNo(orderNo);

if (orderInfo == null){

log.error("订单不存在");

return "failure";

}

//2.判断 total_amount 是否确实为该订单的实际金额(即商家订单创建时的金额)

String totalAmount = params.get("total_amount");

if (!totalAmount.equals(orderInfo.getTotalFee().toString())){

log.error("金额校验失败");

return "failure";

}

//3.校验通知中的 seller_id(或者 seller_email ) 是否为 out_trade_no 这笔单据的对应的操作方

String sellerId = params.get("seller_id");

if (!aliPayClientConfig.getSellerId().equals(sellerId)){

log.error("商家PID校验失败");

return "failure";

}

//4.验证 app_id 是否为该商家本身

String appId = params.get("app_id");

if (!aliPayClientConfig.getAppId().equals(appId)){

log.error("应用APPID校验失败");

return "failure";

}

//5.在支付宝的业务通知中,只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时,

// 支付宝才会认定为买家付款成功。

String tradeStatus = params.get("trade_status");

if (!"TRADE_SUCCESS".equals(tradeStatus)){

log.error("支付未成功");

return "failure";

}

//支付成功后 - 处理订单

aliPayService.processOrder(params);

//除了success外其他返回均认为是失败

return "success";

}else{

log.error("验签失败");

return "failure";

}

}

catch(AlipayApiException e){

log.error("验签异常");

e.printStackTrace();

return "failure";

}

}

4.查询支付

https://opendocs.alipay.com/open/028woa

/**

* 查询订单

* @param orderNo

* @return

*/

@Override

public boolean query(String orderNo) {

//请求

AlipayTradeQueryRequest request=new AlipayTradeQueryRequest();

//数据

AlipayTradeQueryModel bizModel=new AlipayTradeQueryModel();

bizModel.setOutTradeNo(orderNo);

request.setBizModel(bizModel);

try{

//完成签名并执行请求

AlipayTradeQueryResponse response=alipayClient.execute(request);

if(response.isSuccess()){

log.debug("查询订单{}成功",orderNo);

Gson gson = new Gson();

HashMap resultMap=gson.fromJson(response.getBody(),HashMap.class);

String tradeStatus = (String) resultMap.get("trade_status");

if (tradeStatus.equals("TRADE_SUCCESS")){ //订单支付已完成

log.info("调用订单查询接口 - 订单已支付完成");

return true;

}

return false;

}

else{

log.error("查询订单{}失败,响应数据是{}.",orderNo,response.getBody());

return false;

}

}

catch(AlipayApiException e){

log.error("查询订单{}异常",orderNo);

return false;

}

}

5.取消支付

https://opendocs.alipay.com/open/028wob

/**

* 支付宝取消订单接口

* @param orderNo

*/

@Override

public void closeOrder(String orderNo) {

//请求

AlipayTradeCloseRequest request=new AlipayTradeCloseRequest();

//数据

AlipayTradeCloseModel bizModel=new AlipayTradeCloseModel();

bizModel.setOutTradeNo(orderNo);

request.setBizModel(bizModel);

try{

//完成签名并执行请求

AlipayTradeCloseResponse response=alipayClient.execute(request);

if(response.isSuccess()){

log.debug("订单:{}取消成功",orderNo);

}

else{

log.debug("订单:{}未创建,因此也可认为本次取消成功.",orderNo);

}

}

catch(AlipayApiException e){

log.error("订单{}取消异常",orderNo);

throw new ServiceErrorException(ResultCode.ERROR, "订单取消异常");

}

}

总结

支付回调中可能会存在验签一直失败的问题,出现这个问题的可能是公钥使用出错,验签使用的是支付宝公钥而不是应用公钥,如果开发者在开发过程中,出现验证一直不通过的问题可以尝试检查一下

以上就是就是全部内容,本文仅仅简单介绍了支付宝支付的部分API的使用,还有退款以及账单等相关操作后续使用到了会继续更新。

相关推荐

30天学会Python编程:16. Python常用标准库使用教程

16.1collections模块16.1.1高级数据结构16.1.2示例...

强烈推荐!Python 这个宝藏库 re 正则匹配

Python的re模块(RegularExpression正则表达式)提供各种正则表达式的匹配操作。...

Python爬虫中正则表达式的用法,只讲如何应用,不讲原理

Python爬虫:正则的用法(非原理)。大家好,这节课给大家讲正则的实际用法,不讲原理,通俗易懂的讲如何用正则抓取内容。·导入re库,这里是需要从html这段字符串中提取出中间的那几个文字。实例一个对...

Python数据分析实战-正则提取文本的URL网址和邮箱(源码和效果)

实现功能:Python数据分析实战-利用正则表达式提取文本中的URL网址和邮箱...

python爬虫教程之爬取当当网 Top 500 本五星好评书籍

我们使用requests和re来写一个爬虫作为一个爱看书的你(说的跟真的似的)怎么能发现好书呢?所以我们爬取当当网的前500本好五星评书籍怎么样?ok接下来就是学习python的正确姿...

深入理解re模块:Python中的正则表达式神器解析

在Python中,"re"是一个强大的模块,用于处理正则表达式(regularexpressions)。正则表达式是一种强大的文本模式匹配工具,用于在字符串中查找、替换或提取特定模式...

如何使用正则表达式和 Python 匹配不以模式开头的字符串

需要在Python中使用正则表达式来匹配不以给定模式开头的字符串吗?如果是这样,你可以使用下面的语法来查找所有的字符串,除了那些不以https开始的字符串。r"^(?!https).*&...

先Mark后用!8分钟读懂 Python 性能优化

从本文总结了Python开发时,遇到的性能优化问题的定位和解决。概述:性能优化的原则——优化需要优化的部分。性能优化的一般步骤:首先,让你的程序跑起来结果一切正常。然后,运行这个结果正常的代码,看看它...

Python“三步”即可爬取,毋庸置疑

声明:本实例仅供学习,切忌遵守robots协议,请不要使用多线程等方式频繁访问网站。#第一步导入模块importreimportrequests#第二步获取你想爬取的网页地址,发送请求,获取网页内...

简单学Python——re库(正则表达式)2(split、findall、和sub)

1、split():分割字符串,返回列表语法:re.split('分隔符','目标字符串')例如:importrere.split(',','...

Lavazza拉瓦萨再度牵手上海大师赛

阅读此文前,麻烦您点击一下“关注”,方便您进行讨论和分享。Lavazza拉瓦萨再度牵手上海大师赛标题:2024上海大师赛:网球与咖啡的浪漫邂逅在2024年的上海劳力士大师赛上,拉瓦萨咖啡再次成为官...

ArkUI-X构建Android平台AAR及使用

本教程主要讲述如何利用ArkUI-XSDK完成AndroidAAR开发,实现基于ArkTS的声明式开发范式在android平台显示。包括:1.跨平台Library工程开发介绍...

Deepseek写歌详细教程(怎样用deepseek写歌功能)

以下为结合DeepSeek及相关工具实现AI写歌的详细教程,涵盖作词、作曲、演唱全流程:一、核心流程三步法1.AI生成歌词-打开DeepSeek(网页/APP/API),使用结构化提示词生成歌词:...

“AI说唱解说影视”走红,“零基础入行”靠谱吗?本报记者实测

“手里翻找冻鱼,精心的布局;老漠却不言语,脸上带笑意……”《狂飙》剧情被写成歌词,再配上“科目三”背景音乐的演唱,这段1分钟30秒的视频受到了无数网友的点赞。最近一段时间随着AI技术的发展,说唱解说影...

AI音乐制作神器揭秘!3款工具让你秒变高手

在音乐创作的领域里,每个人都有一颗想要成为大师的心。但是面对复杂的乐理知识和繁复的制作过程,许多人的热情被一点点消磨。...

取消回复欢迎 发表评论: