請求參數組裝分下列3步,以最後第三步獲取到的請求爲準
1.請求參數按照 key=value&key=value
方式拼接的未簽名原始字符串:
app_id=2015052600090779&biz_content={"timeout_express":"30m","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.01","subject":"1","body":"我是測試數據","out_trade_no":"IQJZSRC1YMQB5HU"}&charset=utf-8&format=json&method=alipay.trade.app.pay¬ify_url=http://domain.merchant.com/payment_notify&sign_type=RSA2×tamp=2016-08-25 20:26:31&version=1.0
2.再對原始字符串進行簽名,參考阿里簽名規則:
app_id=2015052600090779&biz_content={"timeout_express":"30m","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.01","subject":"1","body":"我是測試數據","out_trade_no":"IQJZSRC1YMQB5HU"}&charset=utf-8&format=json&method=alipay.trade.app.pay¬ify_url=http://domain.merchant.com/payment_notify&sign_type=RSA2×tamp=2016-08-25 20:26:31&version=1.0&sign=cYmuUnKi5QdBsoZEAbMXVMmRWjsuUj+y48A2DvWAVVBuYkiBj13CFDHu2vZQvmOfkjE0YqCUQE04kqm9Xg3tIX8tPeIGIFtsIyp/M45w1ZsDOiduBbduGfRo1XRsvAyVAv2hCrBLLrDI5Vi7uZZ77Lo5J0PpUUWwyQGt0M4cj8g=
3.最後對請求字符串的所有一級 value(biz_content 作爲一個 value)進行 encode,編碼格式按請求串中的 charset 爲準,沒傳 charset 按 UTF-8 處理,獲得最終的請求字符串:
app_id=2015052600090779&biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%22IQJZSRC1YMQB5HU%22%7D&charset=utf-8&format=json&method=alipay.trade.app.pay¬ify_url=http%3A%2F%2Fdomain.merchant.com%2Fpayment_notify&sign_type=RSA2×tamp=2016-08-25%2020%3A26%3A31&version=1.0&sign=cYmuUnKi5QdBsoZEAbMXVMmRWjsuUj%2By48A2DvWAVVBuYkiBj13CFDHu2vZQvmOfkjE0Y
代碼如下
public String getOrderInfoByAliPay(String out_trade_no, String total_amount) throws UnsupportedEncodingException {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date data=new Date(System.currentTimeMillis());
String timestamp = formatter.format(data);
String notify_url = configProperties.getPayCustomer() + "/zjtd/tt/notifyUrl";
String app_id = AlipayConfig.app_id;
String method = "com.gh.customer";
String format = "json";
String charset = "utf-8";
String sign_type = AlipayConfig.sign_type;
String version = "1.0";
Map<String,String> map = new HashMap<>();
map.put("out_trade_no",out_trade_no);
map.put("subject","ghyoho");
map.put("total_amount",total_amount);
map.put("product_code","QUICK_MSECURITY_PAY");
String biz_content = JSON.toJSONString(map);
Map<String,String> paramMap = new HashMap<>();
paramMap.put("app_id",app_id);
paramMap.put("method",method);
paramMap.put("charset",charset);
paramMap.put("sign_type",sign_type);
paramMap.put("notify_url",notify_url);
paramMap.put("timestamp",timestamp);
paramMap.put("biz_content",biz_content);
paramMap.put("version",version);
String signOrderUrl = getSignContent(paramMap);
String rsaSign = "";
/**
@param content 加簽內容
@param privateKey 加簽私鑰
@param charset 加簽字符集
@param charset 簽名方法
**/
try {
rsaSign= AlipaySignature.rsaSign(signOrderUrl, AlipayConfig.merchant_private_key, "utf-8",sign_type);
} catch (AlipayApiException e) {
e.printStackTrace();
}
Map<String,String> retMap = new HashMap<>();
retMap.put("app_id",URLEncoder.encode(app_id,"UTF-8"));
retMap.put("method",URLEncoder.encode(method,"UTF-8"));
retMap.put("charset",URLEncoder.encode(charset,"UTF-8"));
retMap.put("sign_type",URLEncoder.encode(sign_type,"UTF-8"));
retMap.put("notify_url",URLEncoder.encode(notify_url,"UTF-8"));
retMap.put("timestamp",URLEncoder.encode(timestamp,"UTF-8"));
retMap.put("biz_content",URLEncoder.encode(biz_content,"UTF-8"));
retMap.put("version",URLEncoder.encode(version,"UTF-8"));
String retSignOrderUrl = getSignContent(retMap);
retSignOrderUrl = retSignOrderUrl +"&sign="+URLEncoder.encode(rsaSign, "UTF-8");
return retSignOrderUrl;
}
public String getSignContent(Map<String, String> sortedParams) {
StringBuffer content = new StringBuffer();
List<String> keys = new ArrayList(sortedParams.keySet());
Collections.sort(keys);
int index = 0;
for(int i = 0; i < keys.size(); ++i) {
String key = (String)keys.get(i);
String value = (String)sortedParams.get(key);
if (com.alipay.api.internal.util.StringUtils.areNotEmpty(new String[]{key, value})) {
content.append((index == 0 ? "" : "&") + key + "=" + value);
++index;
}
}
return content.toString();
}