hbuilder 微信app支付

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

        



猜你喜欢

转载自blog.csdn.net/lixiaoyi01/article/details/80254062