自从公司要求做app支付一来,扫码支付,公众号支付。现在到app支付,不得不说微信官网的demo水的像一坨(河蟹)根本不知道从哪里入手,最后总结几点,不多说上代码。
public String Pay(Map<String,Object> map){ //参数组 String appid = PaymaxConfig.WX_APPID; String mch_id = PaymaxConfig.WX_MCHID; String nonce_str = RandCharsUtils.getRandomString(16); String body = (String)map.get("body"); String detail = (String) map.get("subject"); String attach = JSON.toJSONString(map.get("metadata")); String out_trade_no = (String)map.get("order_no"); int total_fee = Integer.valueOf((String)map.get("amount"));//单位是分,即是0.01元,前端转化为元 String spbill_create_ip = (String)map.get("client_ip"); String time_start = RandCharsUtils.timeStart(); String time_expire = RandCharsUtils.timeExpire(); String notify_url = PaymaxConfig.WX_NOTIFYURL; String trade_type = PaymaxConfig.WX_TRADETYPE; //参数:开始生成签名 SortedMap<Object,Object> parameters = new TreeMap<Object,Object>(); parameters.put("appid", appid); parameters.put("mch_id", mch_id); parameters.put("nonce_str", nonce_str); parameters.put("body", body); parameters.put("detail", detail); parameters.put("attach", attach); parameters.put("out_trade_no", out_trade_no); parameters.put("total_fee",String.valueOf(total_fee)); parameters.put("time_start", time_start); parameters.put("time_expire", time_expire); parameters.put("notify_url", notify_url); parameters.put("trade_type", trade_type); parameters.put("spbill_create_ip",spbill_create_ip); String sign = WXSignUtils.createSign("UTF-8", parameters); Unifiedorder unifiedorder = new Unifiedorder(); unifiedorder.setAppid(appid); unifiedorder.setMch_id(mch_id); unifiedorder.setNonce_str(nonce_str); unifiedorder.setBody(body); unifiedorder.setDetail(detail); unifiedorder.setAttach(attach); unifiedorder.setOut_trade_no(out_trade_no); unifiedorder.setTotal_fee(total_fee); unifiedorder.setSpbill_create_ip(spbill_create_ip); unifiedorder.setTime_start(time_start); unifiedorder.setTime_expire(time_expire); unifiedorder.setNotify_url(notify_url); unifiedorder.setTrade_type(trade_type); unifiedorder.setSign(sign); Map<String, String> restmap = null; String weixinPost = null; try{ weixinPost = HttpXmlUtils.httpsRequest(PaymaxConfig.WX_URL, PaymaxConfig.POST, HttpXmlUtils.xmlInfo(unifiedorder)).toString(); restmap = XMLUtil.doXMLParse(weixinPost); }catch(Exception e){ log.info("微信支付请求支付对象异常"); return "ERROR"; } SortedMap<Object, Object> payMap = new TreeMap<Object, Object>(); if ("SUCCESS".equals(restmap.get("result_code"))) { payMap.put("appid", restmap.get("appid")); payMap.put("partnerid", restmap.get("mch_id")); payMap.put("prepayid", restmap.get("prepay_id")); payMap.put("package", "Sign=WXPay"); payMap.put("noncestr", restmap.get("nonce_str")); payMap.put("timestamp", payTimestamp()); payMap.put("sign",WXSignUtils.createSign("UTF-8",payMap)); }else{ log.info("二次签名出现异常"); return "ERROR"; } JSONObject payjson = maptojson(payMap); log.info(payjson); return payjson.toJSONString(); } /**获取时间戳**/ public static String payTimestamp() { return Long.toString(System.currentTimeMillis() / 1000); } /**将Map转成json方便前端解析**/ public static JSONObject maptojson(Map map){ JSONObject json = new JSONObject(); for (Object key : map.keySet()) { json.put((String) key, map.get(key)); } return json; }
1.在这里注意一点,total_fee参数为int类型,如果不是int会导致签名失败。
2.所有参数名严格遵守微信支付官网的参数名。
3.请求到prepay_id(预下单支付信息)后必须进行二次签名。
4.配置文件(应用id-appid,微信商户id-mch_id,微信支付接口Url-https://api.mch.weixin.qq.com/pay/unifiedorder,异步通知的地址-WX_NOTIFYURL,支付类型-APP)需要自行配制。还有签名类(WXSignUtils)需要配置一个微信商户的一个api密钥,千万不要搞错了。
这是支付请求的所有代码,帮助代码请去 https://github.com/wenxun199496/weixinpay 下载。
如果还有问题请私信我,随时帮你们解决。
版权声明:本文为u010083127原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。