微信app支付后端的那些坑

自从公司要求做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版权协议,转载请附上原文出处链接和本声明。