app支付寶支付
阿新 • • 發佈:2018-11-18
支付寶app支付用了3天時間將後臺程式碼給寫完了,做得有點粗糙,希望有東西大家可以借鑑
app支付流程,java後臺做得其實比較少
直接上程式碼
String json = "{\"timeout_express\":\"" + timeout_express + "\",\"product_code\":\"" + product_code + "\",\"total_amount\":\"" + totalFee + "\",\"subject\":\"" + subject + "\",\"body\":\"" + body + "\",\"out_trade_no\":\"" + paymentID + "\",\"notify_url\":\"" + notify_url + "\"}"; // logger.info("訂單號========================" + paymentID); //借用支付寶的demo 來構造引數 Map<String, String> params = OrderInfoUtil2_0.buildOrderParamMap(payConfig.getAppId(), true, json); //構造支付訂單引數資訊 String orderParam = OrderInfoUtil2_0.buildOrderParam(params); String privateKey = payConfig.getPrivateKey(); //對支付引數資訊進行簽名 String sign = OrderInfoUtil.getSign(params, privateKey, true); String orderInfo = orderParam + "&" + sign;
//防止http請求後將×tamp變成*tim String replace = orderInfo.replace("×tamp", "wanliu20180506");
OrderInfoUtil2_0這個使用阿里demo就行
WS_APP_PAY_SDK_BASE_2.0\Demo\AndroidDemo_2.0(SDK_15.5.3)\alipay_demo\app\src\main\java\com\alipay\sdk\pay\demo\util
另外這裡有坑,就是這個orderInfo裡面的×tamp轉換,不然後再http請求的時候自動轉換成別的
package com.odfly.module.component.Util; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Random; public class OrderInfoUtil { /** * 構造授權引數列表 * * @param pid * @param app_id * @param target_id * @return */ public static Map<String, String> buildAuthInfoMap(String pid, String app_id, String target_id, boolean rsa2) { Map<String, String> keyValues = new HashMap<String, String>(); // 商戶簽約拿到的app_id,如:201302220024223 keyValues.put("app_id", app_id); // 商戶簽約拿到的pid,如:2088133223816631 keyValues.put("pid", pid); // 服務介面名稱, 固定值 keyValues.put("apiname", "com.alipay.account.auth"); // 商戶型別標識, 固定值 keyValues.put("app_name", "mc"); // 業務型別, 固定值 keyValues.put("biz_type", "openservice"); // 產品碼, 固定值 keyValues.put("product_id", "APP_FAST_LOGIN"); // 授權範圍, 固定值 keyValues.put("scope", "kuaijie"); // 商戶唯一標識,如:kkkkk091125 keyValues.put("target_id", target_id); // 授權型別, 固定值 keyValues.put("auth_type", "AUTHACCOUNT"); // 簽名型別 keyValues.put("sign_type", rsa2 ? "RSA2" : "RSA"); return keyValues; } /** * 構造支付訂單引數列表 * * @param app_id * @return */ public static Map<String, String> buildOrderParamMap(String app_id, boolean rsa2,String json) { Map<String, String> keyValues = new HashMap<String, String>(); keyValues.put("app_id", app_id); keyValues.put("biz_content", json); keyValues.put("charset", "utf-8"); keyValues.put("method", "alipay.trade.app.pay"); keyValues.put("sign_type", rsa2 ? "RSA2" : "RSA"); SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); java.util.Date date=new java.util.Date(); String str=sdf.format(date); keyValues.put("timestamp", str); keyValues.put("version", "1.0"); return keyValues; } /** * 構造支付訂單引數資訊 * * @param map 支付訂單引數 * @return */ public static String buildOrderParam(Map<String, String> map) { List<String> keys = new ArrayList<String>(map.keySet()); StringBuilder sb = new StringBuilder(); for (int i = 0; i < keys.size() - 1; i++) { String key = keys.get(i); String value = map.get(key); sb.append(buildKeyValue(key, value, true)); sb.append("&"); } String tailKey = keys.get(keys.size() - 1); String tailValue = map.get(tailKey); sb.append(buildKeyValue(tailKey, tailValue, true)); return sb.toString(); } /** * 拼接鍵值對 * * @param key * @param value * @param isEncode * @return */ 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(); } /** * 對支付引數資訊進行簽名 * * @param map 待簽名授權資訊 * @return */ public static String getSign(Map<String, String> map, String rsaKey, boolean rsa2) { 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, rsa2); String encodedSign = ""; try { encodedSign = URLEncoder.encode(oriSign, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return "sign=" + encodedSign; } /** * 要求外部訂單號必須唯一。 * * @return */ private static String getOutTradeNo() { SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss", Locale.getDefault()); Date date = new Date(); String key = format.format(date); Random r = new Random(); key = key + r.nextInt(); key = key.substring(0, 15); return key; } }