[关闭]
@File 2019-10-31T06:21:06.000000Z 字数 2972 阅读 168

java 支付宝支付

java 第三方api


相关连接

沙箱后台
网页支付
支付API

一、准备工作

1. 获取公钥私钥

2. 沙箱配置

image_1dlekvqn62i161o1e151bhkh813g.png-32.3kB

3. 下载支付宝沙箱版(Android)

image_1dlekglsr5bjk2i0b32j4bs2m.png-83.1kB

4. 沙箱支付宝账号

image_1dlekd6u67mgdac1dp12q51q0829.png-65.1kB

二、spring-boot

1. 依赖

  1. <dependency>
  2. <groupId>com.alipay.sdk</groupId>
  3. <artifactId>alipay-sdk-java</artifactId>
  4. <version>3.0.0</version>
  5. </dependency>

2. yml配置(可选)

  1. alipay:
  2. # 阿里网关(沙箱和正式网关不一样)
  3. gateway: https://openapi.alipaydev.com/gateway.do
  4. # 编码格式 UTF-8/GBK
  5. charset: UTF-8
  6. # 签名规则 RSA/RSA2
  7. sign-type: RSA
  8. # 阿里公钥(后台获取)
  9. public-key: MIIBIjANBgkqhkiG9w***
  10. # 商户信息
  11. app-infor:
  12. # 支付成功回调验签接口(自定义的外网接口)
  13. notify-url: http://127.0.0.1:8800/PayNotify
  14. # appid(后台获取)
  15. id: 2016***
  16. # 商户私钥(后台获取)
  17. private-key: MIIEvgIBADANBgkqhkiG9w0BAQ***

3. 封装(依赖yml配置)

  1. @Component
  2. public class AlipayUtil {
  3. /**
  4. * 数据格式(固定)
  5. */
  6. private String format = "json";
  7. /**
  8. * 支付宝网关
  9. */
  10. @Value("${alipay.gateway}")
  11. private String gateway;
  12. /**
  13. * appid
  14. */
  15. @Value("${alipay.app-infor.id}")
  16. private String appId;
  17. /**
  18. * 应用私钥
  19. */
  20. @Value("${alipay.app-infor.private-key}")
  21. private String appPrivateKey;
  22. /**
  23. * 编码格式
  24. */
  25. @Value("${alipay.charset}")
  26. private String charset;
  27. /**
  28. * 支付宝公钥
  29. */
  30. @Value("${alipay.public-key}")
  31. private String alipayPublicKey;
  32. /**
  33. * 签名类型
  34. */
  35. @Value("${alipay.sign-type}")
  36. private String signType;
  37. /**
  38. * 回调地址
  39. */
  40. @Value("${alipay.app-infor.notify-url}")
  41. private String notifyUrl;
  42. /**
  43. * 电脑网页支付
  44. * @param url 请求成功跳转页面地址
  45. * @param jsonConfig 配置json字符串
  46. * @return html字符串
  47. */
  48. public String webPay(String url,String jsonConfig){
  49. //实例化客户端
  50. AlipayClient alipayClient = new DefaultAlipayClient(gateway, appId, appPrivateKey, format, charset, alipayPublicKey, signType);
  51. String form = "";
  52. AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
  53. // 客户端跳转地址
  54. request.setReturnUrl(url);
  55. // 在公共参数中设置回跳和通知地址
  56. request.setNotifyUrl(notifyUrl);
  57. // 设置请求参数
  58. request.setBizContent(jsonConfig);
  59. try {
  60. // 调用SDK生成html表单,带js自动提交表单
  61. form = alipayClient.pageExecute(request).getBody();
  62. } catch (AlipayApiException e) {
  63. e.printStackTrace();
  64. }
  65. // 返回html表单字符串
  66. return form;
  67. }
  68. /**
  69. * 支付宝回调参数
  70. * @param paramsMap 回调参数
  71. * @param afterSuccess 成功执行的方法
  72. * @return 响应给支付宝的内容
  73. */
  74. public String signature(Map<String, String> paramsMap, AfterSuccess afterSuccess){
  75. // 默认失败的响应内容
  76. String res = "failure";
  77. try {
  78. // 验签
  79. if(AlipaySignature.rsaCheckV1(paramsMap, alipayPublicKey, charset, signType)){
  80. // 成功响应前的业务逻辑
  81. afterSuccess.success(paramsMap);
  82. // 成功的响应内容
  83. res = "success";
  84. }
  85. } catch (AlipayApiException e) {
  86. e.printStackTrace();
  87. }
  88. return res;
  89. }
  90. /**
  91. * 验签成功辅助接口
  92. */
  93. public interface AfterSuccess {
  94. /**
  95. * 成功执行的方法
  96. * @param params 支付宝传来的参数
  97. */
  98. void success(Map<String, String> params);
  99. }
  100. }

4. 调用

  1. public String pay(int oid) {
  2. // 通过数据库找到订单信息
  3. Order order = orderMapper.findById(oid);
  4. // 组合成json
  5. String json = "{"
  6. // 订单号必须唯一
  7. + "\"out_trade_no\":\""+order.getOutTradeNo()+'"'
  8. + ",\"product_code\":\"FAST_INSTANT_TRADE_PAY\""
  9. // 金额
  10. + ",\"total_amount\":"+order.getPrice()
  11. // 标题
  12. + ",\"subject\":\""+order.getSubject()+'"'
  13. + "}";
  14. return alipayUtil.webPay("https://www.baidu.com/",json);
  15. }
  1. // 验签接口
  2. @PostMapping(value = "/PayNotify")
  3. // 注意:支付宝传过来的参数是表单参数,不能用 @RequestBody 接收
  4. public String payNotify(@RequestParam Map<String,String> collBack){
  5. String signature = alipayUtil.signature(collBack, params -> {
  6. //验签成功执行的业务操作
  7. });
  8. // 给支付宝响应结果
  9. return signature;
  10. }

可能遇到的问题

1. AlipayApiException:RSAcontent 异常

2. 一次支付收到多次回调

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注