支付寶 app 支付的簽名訂單信息

請求參數組裝分下列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&notify_url=http://domain.merchant.com/payment_notify&sign_type=RSA2&timestamp=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&notify_url=http://domain.merchant.com/payment_notify&sign_type=RSA2&timestamp=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&notify_url=http%3A%2F%2Fdomain.merchant.com%2Fpayment_notify&sign_type=RSA2&timestamp=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();
	}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章