Java服务器端支付宝支付的实现

本文主要是实现APP端唤起支付宝支付并完成订单的功能实现

准备

下载最新的官方Demo传送门
下载好后找到WS_APP_PAY_SDK_BASE_2.0\客户端Demo\AndroidDemo_2.0(SDK版本15.2.7)\AndroidDemo_2.0\alipay_demo\src\com\alipay\sdk\pay\demo\util目录下的OrderInfoUtil2_0.java文件,我们主要会用到它,把它复制到自己项目中
还有就是对接的支付宝商户账号需要在蚂蚁金服开放平台中创建好应用

Java服务器端支付宝支付的实现_第1张图片
申请成功的应用列表

并且在【应用环境】中设置好【应用网关】(我这是项目的域名)和【授权回调地址】(接收支付成功通知的URL),还有生成并设置好公私钥(具体不详细说明,总之用官方的工具生成的公私钥要三个:rsa_private_key.pem、rsa_private_key_pkcs8.pem、rsa_public_key.pem,Java服务器端主要用到rsa_private_key_pkcs8.pem中的内容,代码中公私钥都不需要包含头尾),之后去申请【APP支付】的功能
Java服务器端支付宝支付的实现_第2张图片
申请成功的功能信息列表

一切准备好了之后你应该有了以下参数

参数 内容
APPID 形如2016022100609211
AES密钥 长度为24的随机字符串
应用公钥 长度为216的随机字符串(可能长度不一定)
支付宝公钥 长度为216的随机字符串(可能长度不一定)
支付宝私钥 长度为848的随机字符串(可能长度不一定)
支付宝PID(商户号) 形如2088521140216627

唤起支付宝支付

将OrderInfoUtil2_0中的buildOrderParamMap方法修改一下,让他接收总金额total_amount、商品标题subject、交易信息body,如果需要还可以加上passback_params,我这里就加了,修改之后的buildOrderParamMap方法是这样的(CryptoTool是一个我自己定义的加密器)

    public static Map buildOrderParamMap(String app_id,
String total_amount, String subject, String body, String out_trade_no, CryptoTool cryptoTool) {
        Map keyValues = new LinkedTreeMap();

        keyValues.put("app_id", app_id);
        
        String passback_params = cryptoTool.encode(out_trade_no);
        try {
            passback_params = URLEncoder.encode(passback_params, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            passback_params = "error";
            System.out.println("buildOrderParamMap未找到此编码");
        }

        keyValues.put("biz_content", "{\"seller_id\":\""+Constant.ALI_SELLER_ID+
"\",\"product_code\":\"QUICK_MSECURITY_PAY\",\"total_amount\":\""+total_amount+"\",\"subject\":\""+subject+"\",\"body\":\""+body+"\",\"passback_params\":\""+
passback_params+"\",\"out_trade_no\":\"" + out_trade_no +  "\"}");
        
        keyValues.put("charset", "utf-8");

        keyValues.put("method", "alipay.trade.app.pay");
        
        keyValues.put("notify_url", Constant.NOTIFY_URL);

        keyValues.put("sign_type", "RSA");

        keyValues.put("timestamp", DateTool.all(new java.sql.Date(System.currentTimeMillis())));

        keyValues.put("version", "1.0");
        
        return keyValues;
    }

之后我们在action中进行调用

        //你自己的订单编号
        String out_trade_no = "12345678";
        //传入一些订单相关的参数
        Map params = OrderInfoUtil2_0.buildOrderParamMap("你自己的支付宝APPID", "0.01", "大标题", "订单内容", out_trade_no, cryptoTool);
        //对参数进行一些处理
        String orderParam = OrderInfoUtil2_0.buildOrderParam(params);
        //生成签名
        String sign = OrderInfoUtil2_0.getSign(params, Constant.ALI_PRIVATE);
        final String orderInfo = orderParam + "&" + sign;

        System.out.println("orderInfo");
        System.out.println(orderInfo);
        //将处理好的orderInfo传给APP
        HttpServletResponse response = AppTool.getResponse();
        PrintWriter out = response.getWriter();
        out = response.getWriter();
        out.write(orderInfo);
        out.flush();
        out.close();

生成的支付宝订单
之后访问这个action将会获得到一串字符串

app_id=2016111112506666&biz_content=%1B%52seller_id%12%3B%222055621140638888%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3a%22%e4%bd%a0%e7%9a%84%e6%a0%87%e9%a2%98%22%2c%22body%22%3a%22%e8%ae%a2%e5%8d%95%e8%af%a6%e6%83%85%e5%86%85%e5%ae%b9%22%2c%22passback_params%22%3a%22%252Bwq6HOPXA3j12345p4auuyF4h%252FkYUZOJTC1rGY7w%253D%253D%22%2c%22out_trade_no%22%3a%22f8cc41fe58b8333360004%22%7d&charset=utf-8&method=alipay.trade.app.pay¬ify_url=http%3A%2F%2Fbaidu.com%3A9527%2Ftest%2FalipayCallback&sign_type=RSA×tamp=2016-12-01+14%3A42%3A07&version=1.0&sign=iYH5gDau0WX4MxYuGLA0q%2FOiyW64rG315AKrJEZOSCrbP8MEN3wYNESxFpsVKVL%2BJ16kebb9M5U%2BAkWR7fyL%2BLDzq%2BrWL3odRqLqYuHnUh2Xq%2FaXYWJRsF1T%2FCxpsCsWaBFgrxt8OgAzKxwEVTXS10HHtDNtnrwufgE%2BAjUq4Wc%3D

之后让前端同事把官方的Demo下载下来,PayDemoActivity的东西修改并获取你刚刚生成的orderInfo就可以啦

你可能感兴趣的:(Java服务器端支付宝支付的实现)