@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交流。