• 支付宝支付模块开发


    生成二维码

    使用Hutool工具类生成二维码

    引入对应的依赖

    1. <dependency>
    2. <groupId>cn.hutool</groupId>
    3. <artifactId>hutool-all</artifactId>
    4. <version>5.7.5</version>
    5. </dependency>
    6. <dependency>
    7. <groupId>com.google.zxing</groupId>
    8. <artifactId>core</artifactId>
    9. <version>3.3.3</version>
    10. </dependency>

    生成二维码的代码为下:

    1. @Test
    2. public void createCode() {
    3. //generate方法需要传入的参数有: 需要被生成二维码的链接,宽,高, 对应的文件名
    4. QrCodeUtil.generate("https://hutool.cn/", 300, 300, FileUtil.file("D:/qrcode.jpg"));
    5. }

    生成对应的链接的二维码,存到到D盘且名字为qrcode.jpg。

    如果我们需要生成的二维码要传给前端,这时我们需要生成Base64格式。

    对应的代码为下:

    1. @Test
    2. public void createBase64() {
    3. //generateAsBase64方法需要传入的参数有:需要生成二维码的链接,QrConfig对象(用于存储宽和高),对应的图片格式
    4. String base64 = QrCodeUtil.
    5. generateAsBase64("https://hutool.cn/", new QrConfig(300, 300), "png");
    6. System.out.println(base64);
    7. }

    对应的效果为下:

    面试考点

    问:你们公司是怎么生成二维码的?

    答:在刚开始的时候我们将对应的支付链接通过hutool工具类生成对应的二维码图片,但是后续的高并发的场景下服务器非常的卡,因为服务器要同时处理大量的二维码生成业务。以在后续我们直接将链接传给前端,通过前端的js工具类生成对应的二维码。

    支付宝沙盒环境准备 

     支付宝沙盒地址

    下载支付宝沙盒安卓软件

     该软件的账号为下:

    扫码支付的流程

     

    流程的步骤为下:

    1.商户系统调用alipay.trade.precreate方法设置二维码的有效时间,此时调用到支付宝系统,支付宝系统返回二维码链接

    2.商户系统通过方法将二维码链接生成对应的二维码,发送到支付宝app。

    3.用户通过打开支付宝app扫描对应的二维码,进行支付,商户会通过获取支付宝系统返回的信息处理支付结果。

    4.并不是每次支付都会返回结果,如果出现网络问题就不会返回对应的结果,所以我们需要是设置定时任务,轮询查询交易的状态。(我们会使用xxl-job)

    公钥和私钥

    目前的加密算法可以分为:对称加密,非对称加密。

    对称加密:也叫传统加密,加密和解密都使用相同的密钥,它要求发送方和接收方在安全通信之前,要设定好一个密钥,如果要密钥被非法人员获取,其就可以进行加密和解密,所以该密钥的安全性十分的重要。

    目前存在的对称加密的算法为下:

    • AES (默认AES/ECB/PKCS5Padding)
    • ARCFOUR
    • Blowfish
    • DES (默认DES/ECB/PKCS5Padding)
    • DESede
    • RC2
    • PBEWithMD5AndDES
    • PBEWithSHA1AndDESede
    • PBEWithSHA1AndRC2_40

    非对称加密:使用私钥进行加密,使用公钥进行加密,私钥是私有的不会对外暴露,而公钥是共有的,公钥的所有者可以对私钥的所有者进行验证。最常用的就是RSA和DSA。

    1. 签名:使用私钥加密公钥解密。用于让所有公钥所有者验证私钥所有者的身份,并且用来防止私钥所有者发布的内容被篡改,但是不用来保证内容不被他人获得。
    2. 加密:用公钥加密,私钥解密。用于向公钥所有者发布信息,这个信息可能被他人篡改,但是无法被他人获得。

    应用请求三方中私钥公钥的使用

    三方返回信息给应用中私钥公钥的使用:

    EasySDK 

    引入对应的依赖

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

    创建参数类

    1. import lombok.Data;
    2. import org.springframework.boot.context.properties.ConfigurationProperties;
    3. import org.springframework.context.annotation.Configuration;
    4. @Data
    5. @ConfigurationProperties(prefix = "ali.pay")
    6. @Configuration
    7. public class AliProperties {
    8. //请求协议
    9. private String protocol;
    10. // 请求网关
    11. private String gatewayHost;
    12. // 签名类型 RSA2
    13. private String signType;
    14. // 应用ID
    15. private String appId;
    16. // 应用私钥
    17. private String merchantPrivateKey;
    18. // 支付宝公钥
    19. private String alipayPublicKey;
    20. // 异步通知接收服务地址
    21. private String notifyUrl;
    22. // 设置AES密钥
    23. private String encryptKey;
    24. }

    创建配置类

    1. import com.alipay.easysdk.kernel.Config;
    2. import com.example.alipaydemo.entity.AliProperties;
    3. import org.springframework.context.annotation.Bean;
    4. import org.springframework.context.annotation.Configuration;
    5. @Configuration
    6. public class aliPayConfig {
    7. @Bean
    8. public Config getOptions(AliProperties aliProperties) {
    9. Config config = new Config();
    10. config.protocol = aliProperties.getProtocol();
    11. config.gatewayHost = aliProperties.getGatewayHost();
    12. config.signType = aliProperties.getSignType();
    13. //设置对应的appId
    14. config.appId = aliProperties.getAppId();
    15. //设置私钥
    16. config.merchantPrivateKey = aliProperties.getMerchantPrivateKey();
    17. config.alipayPublicKey = aliProperties.getAlipayPublicKey();
    18. //可设置异步通知接收服务地址(可选)
    19. config.notifyUrl = "";
    20. //可设置AES密钥,调用AES加解密相关接口时需要(可选) <-- 请填写您的AES密钥,例如:aa4BtZ4tspm2wnXLb1ThQA== -->
    21. config.encryptKey = "";
    22. return config;
    23. }
    24. }

    创建对应的Controller层

    1. import com.alipay.easysdk.factory.Factory;
    2. import com.alipay.easysdk.kernel.Config;
    3. import com.alipay.easysdk.kernel.util.ResponseChecker;
    4. import com.alipay.easysdk.payment.facetoface.models.AlipayTradePrecreateResponse;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.web.bind.annotation.GetMapping;
    7. import org.springframework.web.bind.annotation.RestController;
    8. @RestController
    9. public class easyAliPayController {
    10. @Autowired
    11. Config config;
    12. @GetMapping("/createOrder")
    13. public AlipayTradePrecreateResponse Create(String orderId) {
    14. //设置对应的参数
    15. Factory.setOptions(config);
    16. //设置项目名,对应的订单号,对应的金额
    17. try {
    18. AlipayTradePrecreateResponse response = Factory.Payment.FaceToFace()
    19. .preCreate("餐掌柜-餐饮消费",
    20. orderId, "0.01");
    21. // 3. 处理响应或异常
    22. if (ResponseChecker.success(response)) {
    23. System.out.println("调用成功");
    24. System.out.println(response.getHttpBody());
    25. return response;
    26. } else {
    27. System.err.println("调用失败,原因:" + response.msg + "," + response.subMsg);
    28. }
    29. } catch (Exception e) {
    30. e.printStackTrace();
    31. }
    32. return null;
    33. }

    在application.yml中配置对应的信息

    1. ali:
    2. pay:
    3. protocol: https
    4. gatewayHost: openapi.alipay.com
    5. signType: RSA2
    6. appId: 9021000128687668
    7. merchantPrivateKey:
    8. alipayPublicKey:
    9. encryptKey: zgJr83uwsyEHG5LCh63d4Q==
    10. notifyUrl:

    最终完成测试。

    easySDK的方法有下:

  • 相关阅读:
    K最邻近法KNN分类算法(多点分类预测)
    Android基础-进程间通信
    微信小程序常用的事件
    从MVC到DDD,该如何下手重构?
    在组件中使用store中的成员
    在vscode中开发sass教程:sass语法
    【C++ Primer Plus】第10章 对象和类
    有关状压DP
    数据挖掘实战(1):信用卡违约率分析
    我们为什么需要 DAO 操作系统?
  • 原文地址:https://blog.csdn.net/Ostkakah/article/details/133282384