最新消息:文章中包含代码时,请遵守代码高亮规范!

支付宝支付(APP支付与电脑网站)

原创文章 user 821浏览 0评论

项目开发中用到的支付宝支付,常见的有电脑网站(PC)与APP端支付,本知识库记录这两种场景下Java后端需要做的工作

电脑网站:

    官方api文档地址:https://docs.open.alipay.com/api_1/alipay.trade.page.pay

    通过此文档可以查看创建交易所需的必传参数等

    先导入阿里的第三方支付包,我们通过maven的方式:   

<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>3.7.26.ALL</version>
</dependency>

    大体流程:通过接受或创建的必传参数,调用阿里的sdk,成功时,阿里会返回一个form表单,后端将这个form表单以字符串的形式返回给前端,前端直接将form表单打印到页面,此form表单自己进行提交操作,跳转至支付页面。

    Java后端代码:

public String aliPayPage(AlipayParams params) {
    AlipayClient alipayClient = new DefaultAlipayClient(url, appId, appPrivateKey, format,
            charset, alipayPublicKey, signType);

    AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
    alipayRequest.setReturnUrl(params.getReturnUrl());
    alipayRequest.setNotifyUrl(params.getNotifyUrl());

    Map<String, Object> paramsMap = new HashMap<>();
    paramsMap.put("out_trade_no", params.getOutTradeNo());
    paramsMap.put("product_code", params.getProductCode());
    paramsMap.put("total_amount", String.valueOf(params.getTotalAmount()));
    paramsMap.put("subject", params.getSubject());


    String paramsStr = ObjectTranUtil.toJsonString(paramsMap);

    log.info("alipay page pay param--{}", paramsStr);

    String form = "";

    alipayRequest.setBizContent(paramsStr);

    try {
        form = alipayClient.pageExecute(alipayRequest).getBody();
    } catch (AlipayApiException e) {
        log.error("alipay exception: ", e);
    }


    return form;
}

其中设置的returnUrl是同步的回调通知地址,前端传入,notifyUrl为异步通知地址,为后端的api接口,用于接收阿里的回调通知,是否支付成功。

APP端与电脑网站大体一致,不过返回的是一串字符串,直接返回给APP端,用于在手机上调起支付宝,这里采用setBizModel的方式

    Java后端代码:

public String aliPayApp(AlipayParams params) {
    AlipayClient alipayClient = new DefaultAlipayClient(url, appId, appPrivateKey, format,
            charset, alipayPublicKey, signType);

    AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
    AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
    model.setBody(params.getBody());
    model.setSubject(params.getSubject());
    model.setOutTradeNo(params.getOutTradeNo());
    model.setTotalAmount(String.valueOf(params.getTotalAmount()));
    model.setProductCode(params.getProductCode());
    request.setBizModel(model);
    request.setNotifyUrl(params.getNotifyUrl());

    AlipayTradeAppPayResponse response = new AlipayTradeAppPayResponse();

    try {
        response = alipayClient.sdkExecute(request);
    } catch (AlipayApiException e) {
        log.error("alipay exception: ", e);
    }

    return response.getBody();
}

其中的一些坑:

首先是公钥,调起支付时,传的公钥其实是没有意义的,传错的也没事,主要是接受阿里回调通知时,做验签操作时,用到的公钥是支付宝公钥而不是商户的应用公钥,具体参数在支付宝开发平台可以获取

另外则是调起支付时,传递的金额字段,官方实例是数字类型,其实调用sdk时,必须传字符串类型,否则会报错

转载时请注明出处及相应链接,本文永久地址:https://blog.yayuanzi.com/25360.html


pay_weixin
pay_weixin
微信打赏
pay_weixin
支付宝打赏
感谢您对作者Miya的打赏,我们会更加努力!    如果您想成为作者,请点我

发表我的评论
取消评论

表情