接口文檔:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1php
URL地址:https://api.mch.weixin.qq.com/pay/unifiedorderjava
一、建立統計下單方法:api
//微信支付統一下單接口地址
private static String unifiedOrderUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";微信
/** * 微信公衆號支付 * @param body 商品描述 * @param outTradeNo 訂單號 * @param totalFee 總金額 分 * @param spbillCreateIp ip地址 * @param openid * @param setBean 微信公衆號的配置參數 * @return */ public static Map<String,String> unifiedorderOfJSPAI(String body, String outTradeNo, Integer totalFee, String spbillCreateIp, String openid, SetBean setBean){ Map<String, String> params = new HashMap<String, String>(); params.put("appid", setBean.getAppId());//公衆號的appid params.put("mch_id", setBean.getMchId());//公衆號的商戶id params.put("body", body);//商品簡單描述 params.put("spbill_create_ip", spbillCreateIp);//用戶端ip params.put("out_trade_no", outTradeNo);//系統訂單號 params.put("total_fee", String.valueOf(totalFee));//支付總金額 單位是分 params.put("trade_type","JSAPI"); params.put("nonce_str", System.currentTimeMillis() / 1000 + "");//隨機字符串 params.put("notify_url", setBean.getNotifyUrl());//支付成功後的通知地址 params.put("openid", openid);//支付用戶的微信openid String sign=createSign(params,setBean.getPayKey());//簽名 params.put("sign",sign); String xmlResult= HttpKit.post(unifiedOrderUrl,toXml(params));//獲取統一下單結果 Map<String, String> result = xmlToMap(xmlResult); return result; //返回的map // nonce_str X2VWhQqd0JhDwxXR // appid wxbXXXXXXXXXXXXXXXXX // sign B0A62A1BD2DCC1953B3681D7ED0F848C // trade_type JSAPI // return_msg OK // result_code SUCCESS // mch_id 123525252 // return_code SUCCESS // prepay_id wx20170502102940927faccf9d123456789 }
生成微信要求的簽名:app
/** * 組裝簽名的字段 * @param params 參數 * @return String */ private static String packageSign(Map<String, String> params) { // 先將參數以其參數名的字典序升序進行排序 TreeMap<String, String> sortedParams = new TreeMap<String, String>(params); // 遍歷排序後的字典,將全部參數按"key=value"格式拼接在一塊兒 StringBuilder sb = new StringBuilder(); boolean first = true; for (Map.Entry<String, String> param : sortedParams.entrySet()) { String value = param.getValue(); if (StrKit.isBlank(value)) { continue; } if (first) { first = false; } else { sb.append("&"); } sb.append(param.getKey()).append("="); sb.append(value); } return sb.toString(); } /** * 生成簽名 * @param params 參數 * @param payKey 支付密鑰 * @return sign */ public static String createSign(Map<String, String> params, String payKey) { // 生成簽名前先去除sign params.remove("sign"); String stringA = packageSign(params); String stringSignTemp = stringA + "&key=" + payKey; return HashKit.md5(stringSignTemp).toUpperCase(); }
@RequestMapping("notify") public String notifyScan(HttpServletRequest request){ String xmlMsg = HttpKit.readData(request); System.out.println("支付通知="+xmlMsg); Map<String, String> params = PaymentKit.xmlToMap(xmlMsg); String result_code = params.get("result_code"); // 總金額 String totalFee = params.get("total_fee"); // 商戶訂單號 String out_trade_no = params.get("out_trade_no"); // 微信支付訂單號 String transId = params.get("transaction_id"); String openid=params.get("openid"); // 支付完成時間,格式爲yyyyMMddHHmmss String timeEnd = params.get("time_end"); SetBean setBean=settingService.getConfig(); if (PaymentKit.verifyNotify(params, setBean.getPayKey())){ if (("SUCCESS").equals(result_code)) { //更新訂單信息 System.out.println("更新訂單信息"); } } Map<String, String> xml = new HashMap<String, String>(); xml.put("return_code", "SUCCESS"); xml.put("return_msg", "OK"); return (PaymentKit.toXml(xml)); } } return ""; } /** * 支付異步通知時校驗sign * @param params 參數 * @param paternerKey 支付密鑰 * @return {boolean} */ public static boolean verifyNotify(Map<String, String> params, String paternerKey){ String sign = params.get("sign"); String localSign = PaymentKit.createSign(params, paternerKey); return sign.equals(localSign); }