Java实现微信App支付服务端的完整攻略:
第一步:注册微信商户平台账号和开通支付功能
- 首先注册微信商户平台账号,并进行企业资质和银行账户的认证;
- 在商户平台上,为自己的应用开通支付功能--微信支付;
- 获取支付证书,在商户平台上进行证书下载、安装和导入等操作;
第二步:生成签名
对请求参数按照ASCII码的顺序进行排序,然后再将所有参数键值对以URL传参方式拼接成字符串,最后使用商户证书中的API密钥进行签名处理。具体示例如下:
public static String createSign(SortedMap<String, Object> parameters, String key) throws Exception {
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, Object> entry : parameters.entrySet()) {
String value = entry.getValue().toString().trim();
if (!value.equals("") && entry.getKey() != "sign") {
sb.append(entry.getKey() + "=" + entry.getValue() + "&");
}
}
sb.append("key=" + key);
String sign = DigestUtils.md5Hex(sb.toString()).toUpperCase();
return sign;
}
第三步:获取预支付交易单号
发起统一下单请求,获取预支付交易单号。请求参数包含商品描述、商户订单号、总金额、终端IP、交易起始时间、交易结束时间等。具体示例如下:
public static String unifiedOrder(String outTradeNo, String appId, String mchId,
String body, String totalFee, String notifyUrl,
String tradeType, String openid) throws Exception {
SortedMap<String, Object> paramMap = new TreeMap<>();
paramMap.put("appid", appId);
paramMap.put("mch_id", mchId);
paramMap.put("nonce_str", RandomStringGenerator.getRandomStringByLength(32));
paramMap.put("body", body);
paramMap.put("out_trade_no", outTradeNo);
paramMap.put("total_fee", totalFee);
paramMap.put("spbill_create_ip", "127.0.0.1");
paramMap.put("notify_url", notifyUrl);
paramMap.put("trade_type", tradeType);
if (openid != null && !"".equals(openid)) {
paramMap.put("openid", openid);
}
String sign = createSign(paramMap, Constant.MD5_KEY);
paramMap.put("sign", sign);
String requestXML = XmlUtils.getRequestXml(paramMap);
String resultXml = HttpClientUtils.httpsRequest(Constant.UNIFIED_ORDER_URL,
"POST", requestXML, Constant.UTF8);
Map<String, String> resultMap = XmlUtils.toMap(resultXml);
String prepayId = resultMap.get("prepay_id");
return prepayId;
}
第四步:获取APP端支付信息
通过预支付交易单号进行签名,获取APP端支付信息。具体示例如下:
public static SortedMap<String, Object> getAppPayInfo(String prepayid) throws Exception {
SortedMap<String, Object> param = new TreeMap<>();
param.put("appid", Constant.APP_ID);
param.put("partnerid", Constant.MCH_ID);
param.put("prepayid", prepayid);
param.put("package", "Sign=WXpay");
param.put("noncestr", RandomStringGenerator.getRandomStringByLength(32));
param.put("timestamp", System.currentTimeMillis() / 1000);
String sign = createSign(param, Constant.MD5_KEY);
param.put("sign", sign);
return param;
}
示例一:生成签名
假设请求参数如下:
SortedMap<String, Object> paramMap = new TreeMap<>();
paramMap.put("appid", "wx2421b1c4370ec43b");
paramMap.put("mch_id", "10000100");
paramMap.put("device_info", "1000");
paramMap.put("body", "test");
paramMap.put("nonce_str", "ibuaiVcKdpRxkhJA");
String sign = createSign(paramMap, "192006250b4c09247ec02edce69f6a2d");
根据API密钥进行签名,签名结果如下:
9A0A8659F005D6984697E2CA0A9CF3B7
示例二:获取预支付交易单号
假设请求参数如下:
String outTradeNo = "20150806125346";
String appId = "wx2421b1c4370ec43b";
String mchId = "10000100";
String body = "test";
String totalFee = "1";
String notifyUrl = "http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php";
String tradeType = "APP";
String openid = "";
String prepayId = unifiedOrder(outTradeNo, appId, mchId, body, totalFee, notifyUrl, tradeType, openid);
根据请求参数,发起统一下单请求,获取预支付交易单号。
示例三:获取APP端支付信息
假设预支付交易单号为:wx2017122310341035e118d5f70428361420
,则获取APP端支付信息如下:
SortedMap<String, Object> payInfo = getAppPayInfo("wx2017122310341035e118d5f70428361420");
其中,payInfo
为签名后的APP端支付信息,可直接传递给APP端进行支付。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现微信App支付服务端 - Python技术站