支付宝支付之APP支付
官方文档:支付宝App支付
1.登陆支付宝开放平台,,创建应用,配置开发公,私钥,得到支付宝公钥,同时申请应用的支付权限(app支付和网页支付需要的权限不同,针对不同需求,申请对应的权限)
查看-->下载官方的公钥生成工具,把生成的私钥(使用RSA则生成1024私钥,如果是RSA2则生成2048私钥)自己保存好,公钥填写入下图对应的应用公钥中(注意区分RSA和RSA2),然后就可以看到应用宝公钥也自动生成了。
2.支付宝支付核心代码
// 支付宝支付 double total_fee=100;//支付费用 total_fee=0.01; Map<String, String> keyValues = new HashMap<String, String>(); String current_time=Utils.getCurrentTime();//得到当前时间 yyyy-MM-dd HH:mm:ss keyValues.put("app_id", 1200551222);//应用的appid keyValues.put("biz_content", "{\"timeout_express\":\"30m\",\"product_code\":\"QUICK_MSECURITY_PAY\",\"total_amount\":\""+total_fee+"\",\"subject\":\""+description+"\",\"body\":\""+body+"\",\"out_trade_no\":\"" +order.getPay_num() + "\"}"); keyValues.put("charset", "utf-8"); keyValues.put("method", "alipay.trade.app.pay"); keyValues.put("sign_type", "RSA"); keyValues.put("timestamp", current_time); keyValues.put("version", "1.0"); keyValues.put("notify_url", PayConfigUtils.getAlipay_notify_url());//支付结果通知地址 String sign=getSign(keyValues,PayConfigUtils.getPrivate_key()); String json=buildOrderParam(keyValues)+"&"+sign;
/** * 构造支付订单参数信息 * * @param map * 支付订单参数 * @return */ public static String buildOrderParam(Map<String, String> map) { List<String> keys = new ArrayList<String>(map.keySet()); Collections.sort(keys); StringBuilder authInfo = new StringBuilder(); for (int i = 0; i < keys.size() - 1; i++) { String key = keys.get(i); String value = map.get(key); try { value=URLEncoder.encode(value,"UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } authInfo.append(buildKeyValue(key, value, false)); authInfo.append("&"); } String tailKey = keys.get(keys.size() - 1); String tailValue = map.get(tailKey); authInfo.append(buildKeyValue(tailKey, tailValue, true)); return authInfo.toString(); }
private static String buildKeyValue(String key, String value, boolean isEncode) { StringBuilder sb = new StringBuilder(); sb.append(key); sb.append("="); if (isEncode) { try { sb.append(URLEncoder.encode(value, "UTF-8")); } catch (UnsupportedEncodingException e) { sb.append(value); } } else { sb.append(value); } return sb.toString(); }
public static String getSign(Map<String, String> map, String rsaKey) { List<String> keys = new ArrayList<String>(map.keySet()); // key排序 Collections.sort(keys); StringBuilder authInfo = new StringBuilder(); for (int i = 0; i < keys.size() - 1; i++) { String key = keys.get(i); String value = map.get(key); authInfo.append(buildKeyValue(key, value, false)); authInfo.append("&"); } String tailKey = keys.get(keys.size() - 1); String tailValue = map.get(tailKey); authInfo.append(buildKeyValue(tailKey, tailValue, false)); String oriSign = SignUtils.sign(authInfo.toString(), rsaKey); String encodedSign = ""; try { encodedSign = URLEncoder.encode(oriSign, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return "sign=" + encodedSign; }
3.支付参数全部得到,app下载对应的sdk,拿到已经构造好的参数,就可以直接去调起支付宝了!