結合微信登陸以及微信支付的案例:= =||| (案例比較奇葩複雜)jquery
簡述項目流程:ajax
1.獲取用於公衆號支付的openid(公衆平臺):在微信內置瀏覽器中打開網頁連接,剛進入頁面就經過微信公衆平臺獲取該微信用戶的code,拿到code傳給後臺,換取用戶的openid。api
2.微信登陸(開放平臺):微信登陸經過微信開放平臺,因爲第一步公衆平臺拿到的code會混淆開放平臺的code,致使用戶使用微信登陸失敗,就須要使用該插件將url參數重置。瀏覽器
3.微信支付(公衆平臺):像後臺傳輸步驟一獲取的openid,以及其餘參數,完成微信公衆號支付。緩存
代碼以下:微信
1.獲取用於公衆號支付的openid:cookie
1 $(function() { 2
3 function isWeiXin() { //判斷是否爲微信環境 4 var ua = window.navigator.userAgent.toLowerCase(); 5 if(ua.match(/MicroMessenger/i) == 'micromessenger') { 6 return true; 7 } else { 8 return false; 9 } 10 } 11 if(isWeiXin()) { //只在微信環境中獲取openid,普通的瀏覽器也獲取不到啊! 12 var openid = $.cookie("geekbar_weixinid"); // Jquery-cookie插件用於存儲獲取到的openid,一開始這裏確定是null。 13 if(openid != null && openid != '') { 14 return; 15 } 16 var code = $.HTTP.getUrlParam("code"); //獲取當前頁面連接中的參數code!一開始這裏確定是null。 17 if(code == undefined || code == null) { 18 var sendUrl = location.href; //redirect_uri(受權後重定向的回調連接地址):當前頁面。 19 sendUrl = $.HTTP.setUrlParam(sendUrl,"xz","public"); //給當前頁面的url添加一個參數xz=public,提示是公衆平臺,避免與開放平臺搞混淆。
//拼接後的地址(例):www.baidu.com?xz=public,對連接自己沒有任何影響。 20 sendUrl = encodeURIComponent(sendUrl); //處理該地址爲格式要求的樣式,點擊查看微信公衆平臺文檔要求。 21
22 //var sendUrl = encodeURIComponent(location.href);
23 var requrl = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=appid&redirect_uri=' +
24 sendUrl + '&response_type=code&scope=snsapi_base&state=wx#wechat_redirect'; 25
26 location.href = requrl; //刷新後頁面連接後便拼接了公衆平臺獲取的code,同時進入else 27 return; 28
29 } else { 30
31 $.ajax({ 32 url: '../common/user/wx/getopenid?code=' + code, //將公衆平臺code傳給後臺,獲取用於公衆號支付的openid 33 success: function(data) { 34 $.cookie("geekbar_weixinopenid", data.data, { //成功後將openid(代碼中的data.data)存入緩存中去。使用jquery-cookie插件。 35 expires: 1
36 }); 37 }, 38 error: function(XMLHttpRequest, textStatus, errorThrown) { 39 var info = "XMLHttpRequest:" + JSON.stringify(XMLHttpRequest) +
40 " ;textStatus:" + textStatus + "; errorThrown:" +
41 JSON.stringify(errorThrown) + "; 【" + opt.url + "】"; 42 alert(info); 43 if(opt.error != undefined) 44 opt.error(XMLHttpRequest, textStatus, errorThrown); 45 else { 46 console.error("請求錯誤", "系統發生請求錯誤,請聯繫管理員解決。"); 47 } 48 } 49 }); 50
51 } 52
53 } else { 54 console.log("當前環境不是微信環境") 55 } 56
57 });
2.微信登陸(開放平臺)app
1 $("#wchartLogin").on("click", function() { 4 var sendUrl = location.href; //受到步驟一的影響,頁面連接後拼接的是公衆平臺獲取的code,xz參數。即xxxx.jsp?code=publiccode&xz=public&state=wx 5 sendUrl = $.HTTP.setUrlParam(sendUrl, "xz", "open"); //重置xz參數:xxxx.jsp?code=publiccode&xz=open&sate=wx 6 sendUrl = $.HTTP.deleteUrlParam(sendUrl, "code"); //刪除公衆平臺code參數:xxxx.jsp?xz=open&state=wx (最爲重要,是混淆開放平臺code的元兇!) 7 sendUrl = $.HTTP.deleteUrlParam(sendUrl, "state"); //刪除state參數:xxxx.jsp?xz=open 8 sendUrl = $.HTTP.setUrlParam(sendUrl, "ls", "wx"); //增添ls參數:xxxx.jsp?xz=open&ls=wx (後臺設置的,沒有此參數不行) 9 sendUrl = encodeURIComponent(sendUrl); //處理成redirect_uri的標準格式。 10 requrl = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=appid&redirect_uri=' + sendUrl + '&response_type=code&scope=snsapi_login&state=wx#wechat_redirect'; 11 location.href = requrl; //就能夠成功登陸了! 12 return; 13 });
3.微信支付(公衆平臺):微信公衆平臺
1 <input type="radio" value="WeiXinPub" name="payType" checked="checked">
1 <script>
2 $(function(){ 3 $("#payFBtn").on("click",function(){ 4 var payType=$("#payChooseList input[name=payType]:checked").val(); 5 if(payType==undefined||payType==null||payType==''){ 6 alert("請選擇支付類型!"); 7 return; 8 } 9 pay('{{orderNo}}',payType); 10 }) 11
12 }) 13 </script>
1 function pay(orderNo, payChannel) { 2 $.HTTP.obj({ 3 url: "../rest/order/pay", 4 ajaxData: { 5 orderNo: orderNo, 6 payChannel: payChannel, 7 wxOpenId: $.cookie("geekbar_weixinid"), //將獲取到的公衆平臺的openid傳給後臺。只有有用戶openid才能支付。 8 success_url: encodeURI(location.href) 9 }, 10 success: function(data) { 11
12 if(data) { 13 switch(payChannel) { 14
15 case "AlipayWap": 16
17 var pos = JSON.stringify(data); 18 pingpp.createPayment(pos, function(result, err) { 19 alert(result); 20 alert(err.msg); 21 alert(err.extra); 22 if(result == "success") { 23
24 } else if(result == "cancel") { 25
26 } 27 }); 28 break; 29
30 case "WeiXinPub": 31 var pos = JSON.stringify(data); 32
33 pingpp.createPayment(pos, function(result, err) { 34 /*alert(result); 35 alert(err.msg); 36 alert(err.extra);*/
37 if(result == "success") { 38 //alert(result);
39 } else if(result == "fail") { 40 alert(err.msg); 41 // charge 不正確或者微信公衆帳號支付失敗時會在此處返回
42 } else if(result == "cancel") { 43 // 微信公衆帳號支付取消支付
44 result = '您已取消支付'; 45 alert(result); 46 } 47 }); 48 break; 49
50 } 51
52 } else { 53 alert("支付異常"); 54 } 55
56 } 57 }) 58 }