alipay实现阿里的支付功能

每一个软件基本都有支付功能,我这边使用了alipay实现简单的支付功能,可以配合二维码生成一起使用(Java实现生成二维码_大白猫~的博客-CSDN博客):

0.加依赖

        
        
            com.alipay.sdk
            alipay-easysdk
            2.2.0
        
        
        
            commons-logging
            commons-logging
            1.2
        

1.书写yml文件(不知道怎么获取的可以看视频或者问chatGPT)

alipay:
  # 支付宝沙箱环境或正式环境
  easy:
    # 通讯协议 可以是http 也可以是https[需要服务器配置SSL证书的]
    protocol: http
    ## 网关地址 沙箱环境是alipaydev 正式环境是alipay
    gatewayHost: openapi.alipaydev.com
    # 签名方式
    signType: RSA2
    # 应用ID
    appId: #你的应用id
    # 应用私钥
    merchantPrivateKey: #你自己的应用私钥
    # 支付宝公钥
    alipayPublicKey: #你自己的应用公钥
    # 是用于进行敏感数据加密和解密的密钥[可选]
    encryptKey: #你的数据加解密密钥
    # 授权回调地址[可选]
    #支付成功后可以阿里会调用你的接口提示
    notifyUrl: http://localhost:8080/pay/aliPay/notify

2.支付宝配置类

(1)先获取信息

@Configuration
@Data
@ConfigurationProperties(prefix = "alipay.easy")
public class AliPayProperties {

    //请求协议
    private String protocol;
    // 请求网关
    private String gatewayHost;
    // 签名类型 RSA2
    private String signType;
    // 应用ID
    private String appId;
    // 应用私钥
    private String merchantPrivateKey;
    // 支付宝公钥
    private String alipayPublicKey;
    // 异步通知接收服务地址
    private String notifyUrl;
    // 设置AES密钥
    private String encryptKey;
}

(2)再配置

@Configuration
public class AlipayConfiguration {

    @Bean
    public Config config(AliPayProperties payProperties) {
        Config config = new Config();
        config.protocol = payProperties.getProtocol();
        config.gatewayHost = payProperties.getGatewayHost();
        config.signType = payProperties.getSignType();

        config.appId = payProperties.getAppId();

        // 为避免私钥随源码泄露,推荐从文件中读取私钥字符串而不是写入源码中
        config.merchantPrivateKey = payProperties.getMerchantPrivateKey();

        //注:如果采用非证书模式,则无需赋值上面的三个证书路径,改为赋值如下的支付宝公钥字符串即可
        config.alipayPublicKey = payProperties.getAlipayPublicKey();

        //可设置异步通知接收服务地址(可选)
        config.notifyUrl = payProperties.getNotifyUrl();

        //可设置AES密钥,调用AES加解密相关接口时需要(可选) <-- 请填写您的AES密钥 -->
        // 接口内容加密方式的加密密钥
        config.encryptKey = payProperties.getEncryptKey();

        // 设置参数(全局只需设置一次)
        Factory.setOptions(config);
        return config;
    }
}

3.编写接口

@RestController
@RequestMapping("/ali")
@Api(tags = "支付宝收付款")
public class AliPayServlet {
    @Resource
    private QRService qrService;

    /**
     * 支付
     *
     * @param subject    商品标题
     * @param code       订单编号
     * @param totalMoney 支付金额
     * @return {@link R}
     */
    @PostMapping("pay")
    @ApiOperation("获取支付二维码")
    @ApiImplicitParams({@ApiImplicitParam(name = "subject", value = "商品名称"),@ApiImplicitParam(name = "code", value = "商品订单号"),@ApiImplicitParam(name = "totalMoney", value = "支付金额")})
    public void pay(String subject, String code, String totalMoney, HttpServletResponse resp) throws Exception {
        AlipayTradePrecreateResponse response = Factory.Payment.FaceToFace().preCreate(subject, code, totalMoney);
        if (ResponseChecker.success(response)) {
            // 请求支付成功,生成支付二维码
            if (Objects.equals(response.getCode(), "10000")) {
                resp.setHeader("content-type", "image/png");
                qrService.generateToStream(response.getQrCode(), resp);
            }
        }
    }
    @PostMapping("/payurl")
    @ApiOperation("获取支付二维码地址")
    @ApiImplicitParams({@ApiImplicitParam(name = "subject", value = "商品名称"), @ApiImplicitParam(name = "code", value = "商品订单号"), @ApiImplicitParam(name = "totalMoney", value = "支付金额")})
    public R paycode(String subject, String code, String totalMoney, HttpServletResponse resp) throws Exception {
        AlipayTradePrecreateResponse response = Factory.Payment.FaceToFace().preCreate(subject, code, totalMoney);
        if (ResponseChecker.success(response)) {
            // 请求支付成功,生成支付二维码
            return R.ok(response.getQrCode());
        }
        return R.fail("");
    }
    /**
     * 查询支付状态
     *
     * @param code 订单编号
     * @return {@link R}
     */
    @GetMapping("query")
    @ApiOperation("查询支付状态")
    @ApiImplicitParams({@ApiImplicitParam(name = "code",value = "订单号")})
    public R queryPayState(String code) throws Exception {
        AlipayTradeQueryResponse response = Factory.Payment.Common().query(code);
        String tradeStatus = response.getTradeStatus();
        if (StringUtils.isEmpty(tradeStatus)) {
            return R.fail("交易不存在");
        } else if (Objects.equals(tradeStatus, "WAIT_BUYER_PAY")) {
            return R.ok("等待买家付款");
        } else if (Objects.equals(tradeStatus, "TRADE_SUCCESS")) {
            return R.ok("支付成功");
        }
        //具体详情标识可以查看官方文档以及chatGPT
        return R.fail("状态查询失败");
    }
}

这样一个简单的阿里支付就完成了,今天的分享就到这里了

你可能感兴趣的:(java,服务器,spring,tomcat,java-ee,spring,boot,nio)