本文主要是实现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文件,我们主要会用到它,把它复制到自己项目中
还有就是对接的支付宝商户账号需要在蚂蚁金服开放平台中创建好应用
并且在【应用环境】中设置好【应用网关】(我这是项目的域名)和【授权回调地址】(接收支付成功通知的URL),还有生成并设置好公私钥(具体不详细说明,总之用官方的工具生成的公私钥要三个:rsa_private_key.pem、rsa_private_key_pkcs8.pem、rsa_public_key.pem,Java服务器端主要用到rsa_private_key_pkcs8.pem中的内容,代码中公私钥都不需要包含头尾),之后去申请【APP支付】的功能
一切准备好了之后你应该有了以下参数
参数 | 内容 |
---|---|
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就可以啦