@GetMapping("/uniorder")
public JSONObject uniOrder(String orderId, double totalPrice, String openid, HttpServletRequest request) throws Exception {
// 获取ip
String SPBILL_CREATE_IP = PayUtilrou.getIp(request);
//微信支付统一下单接口用的参数先存放在Map中
Map<String, String> map = new HashMap<>();
map.put("appid", WxPayConfig.APP_ID);
map.put("mch_id", WxPayConfig.MCH_ID);
// openId
map.put("openid", openid);
//订单编号
map.put("out_trade_no", orderId);
//订单支付金额,单位为分
map.put("total_fee", String.valueOf((int) (totalPrice * 100)));
//支持IPV4和IPV6两种格式的IP地址。调用微信支付API的机器IP,写服务器IP即可
map.put("spbill_create_ip", SPBILL_CREATE_IP);
//32位随机字符串
map.put("nonce_str", PayUtilrou.getRandomString());
//商品描述
map.put("body", WxPayConfig.BODY);
//异步接收微信支付结果通知的回调地址
map.put("notify_url", WxPayConfig.NOTIFY_URL);
//签名格式 小程序取值如下:MD5
map.put("sign_type", WxPayConfig.SIGN_TYPE);
//支付类型 小程序取值如下:JSAPI
map.put("trade_type", WxPayConfig.TRADE_TYPE);
//生成符合规格的签名串
String stringSignTemp = PayUtilrou.getParamStr(map, WxPayConfig.KEY); //realKey == key
System.out.println(stringSignTemp);
//进行MD5运算,并转为大写,获得sign参数的值
String signValue = MD5(stringSignTemp.toString()).toUpperCase();
System.out.println(signValue);
//把sign放入map中
map.put("sign", signValue);
//当sign参数有值时
if (map.get("sign").trim().length() > 0) {
//map转义为xml格式
String requestParam = new String(PayUtilrou.mapToXml(map).getBytes(), "utf-8");
System.out.println(requestParam);
//发送请求
String result = PayUtilrou.sendPostParam(WxPayConfig.PAY_URL, requestParam);
//WxPayConfig.PAY_URL 统一下单接口URL地址
System.out.println(result);
// LOG.info("----uniorder result: " + result);
//将返回的结果从xml字符串转义为map
Map<String, String> resultMap = PayUtilrou.xmlToMap(result);
//初步处理验证返回的结果
String return_code;
System.out.println(resultMap);
}
}
报错
<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[错误的签名,验签失败]]></return_msg></xml>
{return_msg=错误的签名,验签失败, return_code=FAIL}