微信支付这块确实有点坑,文档不全,例子也报错,预定单都下成功了,app端掉不起微信。经过了无数的坑后,终于成功
paytype=ParkObject.Depositlog_wechat;
WxPayModel wxPayModel=new WxPayModel();
wxPayModel.setOutTradeNo(outtradeno);
wxPayModel.setNotifyUrl("http://123.159.193.22:9175/AppWeChatNotify");
wxPayModel.setTotalFee(Integer.valueOf((int) (money*100))+"");
wxPayModel.setBody("充值");
wxPayModel.setFeeType("CNY");
wxPayModel.setTradeType("APP");
wxPayModel.setDeviceInfo("");
wxPayModel.setProductId("12");
wxPayModel.setSpbillCreateIp("123.12.12.123");
Map<Object, Object> unifiedOrder = wxPayService.getWxPay(wxPayModel, "");
jsonObject= (com.alibaba.fastjson.JSONObject) JSONObject.toJSON(unifiedOrder);
@Override
public Map<Object, Object> getWxPay(WxPayModel wsxPayModel,String ip) {
try {
SortedMap<Object, Object> parameters = PayCommonUtil2.getWXPrePayID(); // 获取预付单,此处已做封装,需要工具类
parameters.put("body", wsxPayModel.getBody());
parameters.put("spbill_create_ip",ip);
parameters.put("out_trade_no", wsxPayModel.getOutTradeNo()); // 订单id这里我的订单id生成规则是订单id+时间
parameters.put("total_fee", wsxPayModel.getTotalFee()); // 测试时,每次支付一分钱,微信支付所传的金额是以分为单位的,因此实际开发中需要x100
// parameters.put("total_fee", wsxPayModel.getTotalFee()*100);
// 上线后,将此代码放开
// 设置签名
String sign = PayCommonUtil2.createSign("UTF-8", parameters);
parameters.put("sign", sign);
// 封装请求参数结束
String requestXML = PayCommonUtil2.getRequestXml(parameters); // 获取xml结果
System.out.println("封装请求参数是:" + requestXML);
// 调用统一下单接口
String result = PayCommonUtil2.httpsRequest(ConfigUtil.UNIFIED_ORDER_URL, "POST",
requestXML);
System.out.println("调用统一下单接口:" + result);
SortedMap<Object, Object> parMap = PayCommonUtil2.startWXPay(result);
System.out.println("最终的map是:" + parMap.toString());
return parMap;
} catch (Exception e) {
e.printStackTrace();
Map<Object, Object> errMap = new HashMap<>();
errMap.put("errMsg", e.getMessage());
return errMap;
}
}
/**
* 再次签名,支付
*/
public static SortedMap<Object, Object> startWXPay(String result) {
try {
Map<String, String> map = XMLUtil.doXMLParse(result);
SortedMap<Object, Object> parameterMap = new TreeMap<Object, Object>();
parameterMap.put("appid", ConfigUtil.APPID);
parameterMap.put("partnerid", ConfigUtil.MCH_ID);
parameterMap.put("prepayid", map.get("prepay_id"));
parameterMap.put("package", "Sign=WXPay");
parameterMap.put("noncestr", PayCommonUtil2.CreateNoncestr());
// 本来生成的时间戳是13位,但是ios必须是10位,所以截取了一下
parameterMap.put("timestamp",
Long.parseLong(String.valueOf(System.currentTimeMillis()).toString().substring(0, 10)));
String sign = PayCommonUtil2.createSign("UTF-8", parameterMap);
parameterMap.put("sign", sign);
return parameterMap;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 创建随机数
*
* @param length
* @return
*/
public static String CreateNoncestr() {
String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
String res = "";
for (int i = 0; i < 16; i++) {
Random rd = new Random();
res += chars.charAt(rd.nextInt(chars.length() - 1));
}
return res;
}