服务端集成支付宝APP支付

服务端集成支付宝APP支付

支付宝开发文档链接

支付交互时序图

在这里插入图片描述

准备工作

1.在开放平台完成注册获取appid
2.在与支付宝交易中,会有 2 对公私钥,即商户公私钥,支付宝公私钥。
商户公私钥:由商户生成(在支付宝开发文档官网中可下载一键生成工具工具链接和详细介绍),商户私钥用于对商户发往支付宝的数据签名;商户公钥需要上传至支付宝,当支付宝收到商户发来的数据时用该公钥验证签名。
支付宝公钥:支付宝提供给商户,当商户收到支付宝发来的数据时,用该公钥验签。
3.两对公私钥具体用法
a. 移动端用商户私玥签名,将订单数据传给支付宝客户端,支付宝客户端将订单数据传给支付宝服务器,支付宝服务器根据订单数据中的商户信息,用商户上传的商户公钥验签,成功后进行支付操作;
b. 用户支付成功后,支付宝服务器用支付宝私钥签名回调数据并回调商家服务器(回调URL),同时支付宝客户端回调商家客户端;
c. 商家服务器用支付宝公钥验签,成功后更新商家订单状态等。
4.下载支付宝SDK demo中有alipay-sdk-java-3.3.1.jar等资料 sdk demog下载链接

JAVA服务端 SDK 生成 APP支付订单信息示例

参数
APP_ID:应用ID
APP_PRIVATE_KEY:应用私钥
ALIPAY_PUBLIC_KEY:支付宝公钥
注意:通过调集成支付宝提供的SDK的接口,所返回的结果不须做任何处理直接返回给移动端,注意返回结果中有些类似乱码的字符,切记不是乱码,是正常的直接返回即可,移动端拿到返回字符串完成调取支付宝支付操作即可!

//实例化客户端
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2");
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody("我是测试数据");
model.setSubject("App支付测试Java");
model.setOutTradeNo(outtradeno);
model.setTimeoutExpress("30m");
model.setTotalAmount("0.01");
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl("商户外网可以访问的异步地址");
try {
        //这里和普通的接口调用不同,使用的是sdkExecute
        AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
        System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
    } catch (AlipayApiException e) {
        e.printStackTrace();
}

JAVA服务端验证异步通知信息参数示例(回调处理逻辑)

public void payResultNotice(HttpServletRequest request) {
        try {
            System.out.print("微信支付回调获取数据开始");
            LOG.info("微信支付回调获取数据开始");

            String alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAszB/0JGvO2A2/q7YM2p9o3T0z8A7Qh/0K405svOzTU73jJIrtvLIm0moWB6RSzz3YG+3buQFBC94erOZI2FbcxtKal/3rHLbpgVOpKsCTtV/B+VdKSFkoR2N2/GdkkT1Q4FfqtWL1kaTDMjrkwBnvY+FSUw6HZkEnVTAxFr0pPR4kMSzTQhGhsbgRQJ9FA7AjqMUd+R58IUjK/kUzLppN22ZlhWSxy8bl+M46T6/UESjDXhfujB3JrzJeUFDGHnVC89dDzhgqvg1+ttXcPz7kQccnKKKa+X8Yqjtp84iUj3tAyzuznNwvi2MLo6qwGEZwYQnnWpD6eSpj35KXntYWQIDAQAB";
            String charset = "UTF-8";
            String signType = "RSA2";

            Map<String,String> params = new HashMap<String,String>();
            Map requestParams = request.getParameterMap();
            for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
                String name = (String) iter.next();
                String[] values = (String[]) requestParams.get(name);
                String valueStr = "";
                for (int i = 0; i < values.length; i++) {
                    valueStr = (i == values.length - 1) ? valueStr + values[i]
                            : valueStr + values[i] + ",";
                }
                //乱码解决,这段代码在出现乱码时使用。
                //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
                params.put(name, valueStr);
            }
            boolean flag = AlipaySignature.rsaCheckV1(params, alipayPublicKey, charset,"RSA2");
            System.err.println(flag);
        } catch (Exception e) {
            throw new DataAccessException("【演示版App_支付宝支付】API返回的数据异常", e);
        }
    }

猜你喜欢

转载自blog.csdn.net/songjuguang/article/details/89318037