分享

java微信公共账号支付(JS支付)

 WindySky 2016-08-08

最近公司需要开发微信商城,然后各种作微信的东西啊,各种看API,头大,这里先记录下来以免后面忘记了~

首先是微信提供的api地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6

效果图:




还是那句话,第三方的东西做一遍跟做一百遍效果是一样的,直接上代码咯~

=================================老司机开车咯==============================

order.jsp页面的关键代码:

[javascript] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. var appId = "";  
  2. var timeStamp = "";    
  3. var nonceStr = "";  
  4. var pg = "";  
  5. var signType = "";   
  6. var paySign = "";  
  7.   
  8. //开始支付  
  9. function paymentOrder(){  
  10.     var sta = $("#sta").val();  
  11.       
  12.     if(sta==0){  
  13.         var addressId = $("#addressId").val();  
  14.           
  15.         if(addressId==''||addressId==null){  
  16.             alert("请先选择收货地址");  
  17.             return;  
  18.         }  
  19.           
  20.         var pm = $("#selPayWays").val();  
  21.           
  22.         if(pm==0){  
  23.             //账户余额  
  24.             var userAccount = $("#userAccount").val();  
  25.             var main_price = $(".main-price").html();  
  26.               
  27.             if(parseInt(userAccount)<parseInt(main_price)){  
  28.                 alert("账户余额不足,请选择其它的支付方式!");  
  29.                 return false;  
  30.             }  
  31.             $("#form1").submit();  
  32.         }else if(pm==2){  
  33.             //微信支付  
  34.             var oids = '${oids}';  
  35.             //ajax获取到相关参数  
  36.             $.ajax({  
  37.                 url: '/***/***/wxpayOrder?addressId='+addressId+"&oids="+oids,  
  38.                 type: 'GET',  
  39.                 cache:false,   
  40.                 async:false,   
  41.                 dataType: 'JSON',  
  42.                 timeout: 5000,  
  43.                 error: function(textStatus){alert('系统错误~');},  
  44.                 success: function(msg){  
  45.                       
  46.                     if(msg!=null){  
  47.                         appId = msg.appId;  
  48.                         timeStamp = msg.timeStamp;    
  49.                         nonceStr = msg.nonceStr;  
  50.                         pg = msg.prepay_id;  
  51.                         signType = msg.signType;   
  52.                         paySign = msg.sign;  
  53.                     }  
  54.                 }  
  55.             });  
  56.             //唤起微信支付  
  57.             if(appId!=''){  
  58.                 pay();  
  59.             }  
  60.               
  61.         }  
  62.               
  63.     }else{  
  64.         alert("订单已关闭");  
  65.     }  
  66.       
  67.       
  68. }  
  69.   
  70. //唤起微信支付  
  71. function pay(){    
  72.     if (typeof WeixinJSBridge == "undefined"){    
  73.        if( document.addEventListener ){    
  74.            document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);    
  75.        }else if (document.attachEvent){    
  76.            document.attachEvent('WeixinJSBridgeReady', onBridgeReady);     
  77.            document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);    
  78.        }    
  79.     }else{    
  80.        onBridgeReady();    
  81.     }     
  82.         
  83. }    
  84.   
  85. //开始支付  
  86. function onBridgeReady(){    
  87.     WeixinJSBridge.invoke(    
  88.         'getBrandWCPayRequest', {    
  89.             "appId" : appId,     //公众号名称,由商户传入         
  90.             "timeStamp": timeStamp+"",         //时间戳,自1970年以来的秒数         
  91.             "nonceStr" : nonceStr, //随机串         
  92.             "package" : "prepay_id=" + pg,         
  93.             "signType" : signType,         //微信签名方式:         
  94.             "paySign" : paySign    //微信签名     
  95.         },    
  96.             
  97.         function(res){         
  98.             if(res.err_msg == "get_brand_wcpay_request:ok" ) {    
  99.                 alert("支付成功");  // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回    ok,但并不保证它绝对可靠。     
  100.                 //回到用户订单列表  
  101.                 window.location.href="http://wx./wechat/order/orderlist";  
  102.             }else if (res.err_msg == "get_brand_wcpay_request:cancel")  {  
  103.                 alert("支付过程中用户取消");  
  104.             }else{  
  105.                //支付失败  
  106.                alert(res.err_msg)  
  107.             }       
  108.         }    
  109.     );     
  110.  }   
后台生成预支付id的关键代码:

  1. UnifiedorderResult unifiedorderResult = null;  
  2.             //getSumTotal 微信的价格单位是分(x100),所以intValue 不存在精度丢失的问题  
  3.             int total_fee = (trans.getTotal().intValue() - userBonus - userYqh)*100;  
  4.             total_fee = 1;//一分钱测试  
  5.             unifiedorderResult = WxPay.getWxPayUnifiedResult(body, detail, attach,trans.getId()+CommonUtils.getRandByNum(6), total_fee, spbill_create_ip,loginUser.getThirdLoginWXId());  
  6.             String timestamp = String.valueOf(new Date().getTime()/1000);  
  7.             String nonceStr = unifiedorderResult.getNonce_str();  
  8.             String prepay_id = unifiedorderResult.getPrepay_id();  
  9.   
  10.             jsonObject.put("appId", WxConfig.appid);  
  11.             jsonObject.put("timeStamp", timestamp);  
  12.             jsonObject.put("signType", "MD5");  
  13.             jsonObject.put("nonceStr", nonceStr);  
  14.             jsonObject.put("package", "prepay_id="+prepay_id);  
  15.   
  16.             //参数:开始生成签名  
  17.             SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();  
  18.             parameters.put("appId", WxConfig.appid);  
  19.             parameters.put("timeStamp", timestamp);  
  20.             parameters.put("signType", "MD5");  
  21.             parameters.put("nonceStr", nonceStr);  
  22.             parameters.put("package", "prepay_id="+prepay_id);  
  23.   
  24.             String sign = WXSignUtils.createSign("UTF-8", parameters);  
  25.             jsonObject.put("sign", sign);  
  26.             jsonObject.put("prepay_id", prepay_id);  
  27.   
  28.             writer.write(jsonObject.toString());  
  29.             System.out.println("预支付id相关参数是:"+jsonObject.toString());  
  30.             if(writer!=null){  
  31.                 writer.close();  
  32.             }  
total=1;//1分钱测试,这里设置了后所有的商品都是1分钱的东西了,切记上线之前要注释掉!!否则你老板就要叫你去他办公室聊人生,谈理想了~
生成签名的关键代码:之前做app支付的时候贴过源代码的,现在再贴一次,唯一不同的是,这里签名一定需要传openid

  1. /** 
  2.      * 统一下单得到prepay_id(预支付id) 
  3.      * @param body 
  4.      * @param detail 
  5.      * @param attach 
  6.      * @param out_trade_no 
  7.      * @param total_fee 
  8.      * @param spbill_create_ip 
  9.      * @return 
  10.      */  
  11.     public static UnifiedorderResult getWxPayUnifiedResult(String body,String detail,String attach,String out_trade_no,int total_fee,String spbill_create_ip,String openid){  
  12.         try{  
  13.             //应用APPID【appid】  
  14.             String appid = WxConfig.appid;  
  15.             //System.out.println("appid是:"+appid);  
  16.             //微信支付商户号【mch_id】  
  17.             String mch_id = WxConfig.mch_id;  
  18.             //System.out.println("mch_id是:"+mch_id);  
  19.             //回调地址  
  20.             String notify_url = WxConfig.notify_url;  
  21.             //随机字符串  
  22.             String nonce_str = RandCharsUtils.getRandomString(16);  
  23.             //System.out.println("随机字符串是:"+nonce_str);  
  24.             //交易起始时间  
  25.             String time_start = RandCharsUtils.timeStart();  
  26.             //System.out.println(time_start);  
  27.             //交易结束时间  
  28.             String time_expire = RandCharsUtils.timeExpire();  
  29.             //System.out.println(time_expire);  
  30.             //交易类型  
  31.             String trade_type = "JSAPI";//JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付,统一下单接口trade_type的传参可参考这里  
  32.               
  33.             //body = "黑色手拿包";  
  34.               
  35.             //参数:开始生成签名  
  36.             SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();  
  37.             parameters.put("appid", appid);  
  38.             parameters.put("mch_id", mch_id);  
  39.             parameters.put("nonce_str", nonce_str);  
  40.             //body = Utf8EncodeUtils.getUTF8XMLString(body);  
  41.             //System.out.println("body是:"+body);  
  42.             parameters.put("body", body.toString());  
  43.             //detail = Utf8EncodeUtils.getUTF8XMLString(detail);  
  44.             //System.out.println("detail是:"+detail);  
  45.             parameters.put("detail", detail.toString());  
  46.             parameters.put("attach", attach);  
  47.             parameters.put("out_trade_no", out_trade_no);  
  48.             parameters.put("total_fee", total_fee);  
  49.             parameters.put("time_start", time_start);  
  50.             parameters.put("time_expire", time_expire);  
  51.             parameters.put("notify_url", notify_url);  
  52.             parameters.put("trade_type", trade_type);  
  53.             parameters.put("spbill_create_ip", spbill_create_ip);  
  54.             parameters.put("openid", openid);  
  55.               
  56.             //开始签名  
  57.             String sign = WXSignUtils.createSign("UTF-8", parameters);  
  58.             System.out.println("签名是:"+sign);  
  59.             log.debug("微信支付签名:"+sign);  
  60.               
  61.             Unifiedorder unifiedorder = new Unifiedorder();  
  62.             unifiedorder.setAppid(appid);  
  63.             unifiedorder.setMch_id(mch_id);  
  64.             unifiedorder.setNonce_str(nonce_str);  
  65.             unifiedorder.setSign(sign);  
  66.             unifiedorder.setBody(body);  
  67.             unifiedorder.setDetail(detail);  
  68.             unifiedorder.setAttach(attach);  
  69.             unifiedorder.setOut_trade_no(out_trade_no);  
  70.             unifiedorder.setTotal_fee(total_fee);  
  71.             unifiedorder.setSpbill_create_ip(spbill_create_ip);  
  72.             unifiedorder.setTime_start(time_start);  
  73.             unifiedorder.setTime_expire(time_expire);  
  74.             unifiedorder.setNotify_url(notify_url);  
  75.             unifiedorder.setTrade_type(trade_type);  
  76.             unifiedorder.setOpenid(openid);  
  77.               
  78.             //构造xml参数  
  79.             String xmlInfo = HttpXmlUtils.xmlInfo(unifiedorder);  
  80.               
  81.             System.out.println(xmlInfo);  
  82.               
  83.             String wxUrl = UnifiedorderUrl;  
  84.               
  85.             String method = "POST";  
  86.               
  87.             String weixinPost = HttpXmlUtils.httpsRequest(wxUrl, method, xmlInfo).toString();  
  88.               
  89.             System.out.println(weixinPost);  
  90.             log.debug("微信支付返回:"+weixinPost);  
  91.               
  92.             return JdomParseXmlUtils.getUnifiedorderResult(weixinPost);  
  93.         }catch(Exception ex){  
  94.             ex.printStackTrace();  
  95.               
  96.             log.debug("微信支付:"+ex.getMessage());  
  97.         }  
  98.           
  99.         return null;  
  100.     }  


这里会出现的问题也是一直提醒签名失败,我擦,为毛每次都是签名的问题,烦不烦~~~~

拿到与支付id后再次签名的时候由于没有标准的文档格式,只能靠自己仔细读那陀代码了


额,到此为止,js支付应该没什么问题了,good luck~


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多