@RequestMapping(value="wxTestPay") @ResponseBody public String wxTestPay(HttpServletRequest request, HttpServletResponse response) throws ParseException, JDOMException, IOException{ // 账号信息 String appid = PayConfigUtil.APP_APP_ID; // appid String mch_id = PayConfigUtil.APP_MCH_ID; // 商户号 String key = PayConfigUtil.APP_API_KEY; // apikey //随机字符串 String nonce_str = PayCommonUtil.getRandomStringByLength(16); // 获取发起电脑 ip String spbill_create_ip = BaseUtil.getLoginIp(); //PayConfigUtil.CREATE_IP; System.out.println("真实ip"+spbill_create_ip); // 回调接口 String notify_url = PayConfigUtil.NOTIFY_URL; //交易类型 app支付 String trade_type = "APP"; String out_trade_no=generateOrderNo(); System.out.println("订单号"+out_trade_no); SortedMap<Object,Object> packageParams = new TreeMap<Object,Object>(); packageParams.put("appid", appid); packageParams.put("mch_id", mch_id); packageParams.put("nonce_str", nonce_str); packageParams.put("body", "test"); packageParams.put("out_trade_no", out_trade_no); packageParams.put("total_fee", "100"); //价格的单位为分 packageParams.put("spbill_create_ip", spbill_create_ip); packageParams.put("notify_url", notify_url); packageParams.put("trade_type", trade_type); //签名 String sign = PayToolUtil.createSign("UTF-8", packageParams,key); packageParams.put("sign", sign); //请求参数封装结束 String requestXML = PayToolUtil.getRequestXml(packageParams); System.out.println(requestXML); // 调用统一下单接口 String result = PayCommonUtil.httpsRequest(PayConfigUtil.UFDODER_URL, "POST",requestXML); System.out.println("返回的result"+result); Map<String, String> map = XmlUtil.doXMLParse(result); SortedMap<Object, Object> parameterMap = new TreeMap<Object, Object>(); parameterMap.put("appid", appid); parameterMap.put("partnerid", mch_id); parameterMap.put("prepayid", map.get("prepay_id")); parameterMap.put("package", "Sign=WXPay"); parameterMap.put("noncestr", nonce_str); int mis = Integer.parseInt(String.valueOf(System.currentTimeMillis()).toString().substring(0, 10)); parameterMap.put("timestamp", mis +""); sign = PayToolUtil.createSign("UTF-8", parameterMap,key); parameterMap.put("sign", sign); //请求参数封装结束 String requestXML2 = PayToolUtil.getRequestXml(parameterMap); System.out.println(requestXML2); parameterMap.put("timestamp", mis); String json = JSONUtils.toJSONString(parameterMap); System.out.println(json); return json; }
上面是后台代码,需要注意的几个点:
一、noncestr保证两次签名一致。
二、时间戳int类型、
hbuilder代码:
var wxChannel = null; // 微信支付 var aliChannel = null; // 支付宝支付 var channel = null; var orderCode = ""; //页面加载时 mui.plusReady(function(){ //关闭等待框 plus.nativeUI.closeWaiting(); // 获取支付通道 plus.payment.getChannels(function(channels){ aliChannel=channels[0]; wxChannel=channels[1]; },function(e){ alert("获取支付通道失败:"+e.message); }); }); $("#pay").click(function(){ var radio = $('input[name="radio"]:checked ').val(); //请求后台数据 var url = ''; if(radio == '2'){ url = basePath+"aliPayMobile/"+orderCode; channel = aliChannel; }else if(radio == '1'){ url = basePath+"wxMobilePay/"+orderCode; channel = wxChannel; } plus.nativeUI.showWaiting(); mui.post(url, function(data) { plus.nativeUI.closeWaiting(); if (data) { plus.payment.request(channel, data, function(result) { mui.toast("支付成功"); }, function(e) { //取消支付 mui.toast("取消支付"); }); } else { } }); });
注意:生成的签名一定要正确,可以去官方工具验证。
如果感觉所有的参数都没有问题,
就看微信开放平台的应用签名是否正确。
app的包名要和开放平台的包名一致。
微信app支付要打包测试,打包前先生成证书,我就用的jre生成的keystore,密钥密码要记住,这里填写的包名要和开放平台的对应上,打包成app之后,在用微信官方的获取应用签名的工具获取,只需要填写上面的包名就可以获取,之后去开放平台填写上上一步的应用签名即可。这里没有考虑取消支付,prepared_id有效期的问题,这里处理就是取消的话就重新下单。(可以用缓存控制)。有问题可以加q:420229601交流。