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

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

ztj100 2025-03-24 22:45 8 浏览 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的使用,还有退款以及账单等相关操作后续使用到了会继续更新。

相关推荐

使用 Pinia ORM 管理 Vue 中的状态

转载说明:原创不易,未经授权,谢绝任何形式的转载状态管理是构建任何Web应用程序的重要组成部分。虽然Vue提供了管理简单状态的技术,但随着应用程序复杂性的增加,处理状态可能变得更具挑战性。这就是为什么...

Vue3开发企业级音乐Web App 明星讲师带你学习大厂高质量代码

Vue3开发企业级音乐WebApp明星讲师带你学习大厂高质量代码下栽课》jzit.top/392/...

一篇文章说清 webpack、vite、vue-cli、create-vue 的区别

webpack、vite、vue-cli、create-vue这些都是什么?看着有点晕,不要怕,我们一起来分辨一下。...

超赞 vue2/3 可视化打印设计VuePluginPrint

今天来给大家推荐一款非常不错的Vue可拖拽打印设计器Hiprint。引入使用//main.js中引入安装import{hiPrintPlugin}from'vue-plugin-...

搭建Trae+Vue3的AI开发环境(vue3 ts开发)

从2024年2025年,不断的有各种AI工具会在自媒体中火起来,号称各种效率王炸,而在AI是否会替代打工人的话题中,程序员又首当其冲。...

如何在现有的Vue项目中嵌入 Blazor项目?

...

Vue中mixin怎么理解?(vue的mixins有什么用)

作者:qdmryt转发链接:https://mp.weixin.qq.com/s/JHF3oIGSTnRegpvE6GSZhg前言...

Vue脚手架安装,初始化项目,打包并用Tomcat和Nginx部署

1.创建Vue脚手架#1.在本地文件目录创建my-first-vue文件夹,安装vue-cli脚手架:npminstall-gvue-cli安装过程如下图所示:创建my-first-vue...

新手如何搭建个人网站(小白如何搭建个人网站)

ElementUl是饿了么前端团队推出的桌面端UI框架,具有是简洁、直观、强悍和低学习成本等优势,非常适合初学者使用。因此,本次项目使用ElementUI框架来完成个人博客的主体开发,欢迎大家讨论...

零基础入门vue开发(vue快速入门与实战开发)

上面一节我们已经成功的安装了nodejs,并且配置了npm的全局环境变量,那么这一节我们就来正式的安装vue-cli,然后在webstorm开发者工具里运行我们的vue项目。这一节有两种创建vue项目...

.net core集成vue(.net core集成vue3)

react、angular、vue你更熟悉哪个?下边这个是vue的。要求需要你的计算机安装有o.netcore2.0以上版本onode、webpack、vue-cli、vue(npm...

使用 Vue 脚手架,为什么要学 webpack?(一)

先问大家一个很简单的问题:vueinitwebpackprjectName与vuecreateprojectName有什么区别呢?它们是Vue-cli2和Vue-cli3创建...

vue 构建和部署(vue项目部署服务器)

普通的搭建方式(安装指令)安装Node.js检查node是否已安装,终端输入node-v会使用命令行(安装)npminstallvue-cli-首先安装vue-clivueinitwe...

Vue.js 环境配置(vue的环境搭建)

说明:node.js和vue.js的关系:Node.js是一个基于ChromeV8引擎的JavaScript运行时环境;类比:Java的jvm(虚拟机)...

vue项目完整搭建步骤(vuecli项目搭建)

简介为了让一些不太清楚搭建前端项目的小白,更快上手。今天我将一步一步带领你们进行前端项目的搭建。前端开发中需要用到框架,那vue作为三大框架主流之一,在工作中很常用。所以就以vue为例。...

取消回复欢迎 发表评论: