新項目,不論是手機端仍是 PC 端基本上都會有微信登陸、微信支付,甚至還會作一個微信公衆號。整個體系龐大,資料也千奇百怪。因此特意總結一篇微信開發的技巧和相應資料來幫助你提升開發效率。php
官方推薦的 PC 端登陸是經過微信開放平臺建立應用來實現的。凡是建立的應用都能用下面微信提供的連接來進行掃碼受權操做html
https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
複製代碼
鏈接中包含如下參數:前端
能夠看到 response_type, scope 都是寫死的。appid 會在你建立應用的時候給你(固然還有 AppSecret)。state 主要是爲了用於驗證是不是別人假冒的請求。重點是 redirect_uri。當用戶掃碼以後微信會重定向當前頁面跳轉到 redirect_uri 指向的地址。這個連接須要進行 urlEncode 進行重定向。爲何須要 urlEncode 對連接進行處理呢,我搜了一些資料總結了倆條我認爲最重要的理由:java
對 url 進行編碼也很簡單,下面的 js 代碼直接拷貝便可android
let a = 'http://xuyuechao.top'
// 編碼
let b = encodeURIComponent(a)
// 解碼
decodeURIComponent(b)
複製代碼
這裏須要注意別用 encodeURI 。他是不會對 ASCII 字母和數字進行編碼的。web
到了這裏一個完整的微信受權連接就已經有了,經過 a 連接打開一個新頁面或者是經過 js 打開一個新頁面均可以。這個受權連接打開的頁面會帶有一張二維碼,這時候用戶掃碼分爲倆種操做:贊成受權和不一樣意受權。而他們最大的不一樣是跳轉到重定向鏈接的時候是否帶有 codeajax
// 用戶贊成受權
redirect_uri?code=CODE&state=STATE
// 用戶不一樣意受權
redirect_uri?state=STATE
複製代碼
實現這一步前端的使命基本上已經完成了,由於核心 code 到手剩下的就是後端的事情了,簡單描述一下後續步驟:後端
上面的那種是打開新窗口的模式,效果以下圖:api
這種方式是強制性跳轉到新頁面並不友好,因此微信還提供了另一種 JS 的方式,在當前頁面打開一個 iframe 窗口來提供整個網站的流暢性。步驟以下:數組
<script>http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js
</script>
複製代碼
var obj = new WxLogin({
self_redirect:true,
id:"login_container",
appid: "",
scope: "",
redirect_uri: "",
state: "",
style: "",
href: ""
});
複製代碼
微信登陸掃碼是能夠關注公衆號的哦,這裏就用到了一種很是規登陸方式。優勢主要有二:
廢話很少說,立刻給你上實現步驟:
能夠看到這個方法對於前端來講更簡單,定義一個 img 標籤,獲取到後端返回的二維碼地址將 img 標籤的 src 屬性修改成這個地址便可。而後開啓輪詢訪問接口。相關資料可參考這篇文章:文章地址
先聲明此處特指微信內網頁登陸方式
這種方式跟上面提到的 PC 端普通登陸方式基本相似,廢話很少說上實現步驟
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
複製代碼
只獲取用戶的 openid 不須要用戶受權的靜默連接 scope=snsapi_base
須要用戶受權,獲取用的暱稱、性別、所在地 scope=snsapi_userinfo
// 用戶贊成受權
redirect_uri?code=CODE&state=STATE
// 用戶不一樣意受權
redirect_uri?state=STATE
複製代碼
注意:redirect_uri 的連接須要在微信提供的白名單裏
我的感受微信最麻煩的是概念的理解以及相關文章的查找,這倆個是我在日常開發的時候特別頭疼的。當你完成一次的時候概念其實能夠變爲具體的操做步驟,從上文能夠看出不論是 PC 端仍是手機端都是使用微信提供的連接地址,而後用戶進行了相應的操做以後進行 redirect_uri 重定向的時候帶有 code 完成的。相關文章我已經幫你找好了,在這裏在羅列一遍好讓你很是容易的找到相關文章:
手機端完成微信支付有倆種方式,一種採用微信支付文章中的支付方式,另一種採用微信公衆號提供的支付方式。微信支付提供的支付方式實現比較簡單,一樣功能也少。我的推薦採用公衆號提供的支付方式。
這種支付的重點在於微信內瀏覽器提供了一個叫 WeixinJSBridge 的全局變量。須要作的是判斷是否在微信內。這裏送你一個判斷手機端環境的方式:
BrowserInfo = {
isAndroid: Boolean(navigator.userAgent.match(/android/ig)),
isIphone: Boolean(navigator.userAgent.match(/iphone|ipod/ig)),
isIpad: Boolean(navigator.userAgent.match(/ipad/ig)),
isWeixin: Boolean(navigator.userAgent.match(/MicroMessenger/ig)),
isAli: Boolean(navigator.userAgent.match(/AlipayClient/ig)),
isPhone: Boolean(/(iPhone|iPad|iPod|iOS|Android)/i.test(navigator.userAgent))
}
複製代碼
好了開始介紹支付步驟
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
}
}else{
onBridgeReady();
}
複製代碼
function onBridgeReady(){
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId":"wx2421b1c4370ec43b", //公衆號名稱,由商戶傳入
"timeStamp":"1395712654", //時間戳,自1970年以來的秒數
"nonceStr":"e61463f8efa94090b1f366cccfbbb444", //隨機串
"package":"prepay_id=u802345jgfjsdfgsdg888",
"signType":"MD5", //微信簽名方式:
"paySign":"70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信簽名
},
function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ){
// 使用以上方式判斷前端返回,微信團隊鄭重提示:
//res.err_msg將在用戶支付成功後返回ok,但並不保證它絕對可靠。
}
});
}
複製代碼
整個支付流程到此結束,難點主要是 paySign 的簽名方式,可是這一步是放在後端的,因此前端要實現這種支付方式仍是異常簡單的。在 Java 中 package 這個參數每每會給你用別的名字,由於 package 在 java 中是一個關鍵字,因此後端無法直接給你返回正好符合格式的對象,這點有點不友好但也不要怪後端哦。 相關文檔連接地址: 文檔地址
這種支付方式要比上面的流程更復雜,可是功能也多(主要指支付以外的功能)。直接上步驟
// 注意這個是帶有版本號的,最好經過下面提供的文章連接用最新的連接地址
<script src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
複製代碼
wx.config({
debug: true, // 開啓調試模式,調用的全部api的返回值會在客戶端alert出來,若要查看傳入的參數,能夠在pc端打開,參數信息會經過log打出,僅在pc端時纔會打印。
appId: '', // 必填,公衆號的惟一標識
timestamp: , // 必填,生成簽名的時間戳
nonceStr: '', // 必填,生成簽名的隨機串
signature: '',// 必填,簽名
jsApiList: [] // 必填,須要使用的JS接口列表
});
複製代碼
wx.ready(function(){
// config信息驗證後會執行ready方法,全部接口調用都必須在config接口得到結果以後,config是一個客戶端的異步操做,因此若是須要在頁面加載時就調用相關接口,則須把相關接口放在ready函數中調用來確保正確執行。對於用戶觸發時才調用的接口,則能夠直接調用,不須要放在ready函數中。
});
複製代碼
wx.chooseWXPay({
timestamp: 0, // 支付簽名時間戳,注意微信jssdk中的全部使用timestamp字段均爲小寫。但最新版的支付後臺生成簽名使用的timeStamp字段名需大寫其中的S字符
nonceStr: '', // 支付簽名隨機串,不長於 32 位
package: '', // 統一支付接口返回的prepay_id參數值,提交格式如:prepay_id=\*\*\*)
signType: '', // 簽名方式,默認爲'SHA1',使用新版支付需傳入'MD5'
paySign: '', // 支付簽名
success: function (res) {
// 支付成功後的回調函數
}
});
複製代碼
相關文檔連接地址: 文檔地址
這個咋說呢,重點所有在後端,前端要作的事情確實很少,步驟以下:
相關文檔連接地址: 文檔地址
能夠看到整個微信登陸和支付過程並不複雜,可是新手剛開始操做確定會碰到各類問題。其中籤名不對是最麻煩的,由於他須要前端提供回調地址,而回調地址的設置又一般不是前端設置的,我這裏給出的建議是出現相似問題能夠優先查找白名單和回調地址的配置跟前端設置的是否一致。
再安利一波文章中提到的各類鏈接地址
爲了文章更好的完善特意創建了羣提供交流環境,固然支付遇到問題也能夠進行提問。歡迎掃描下方二維碼加羣。手機端掃碼不便,能夠複製微信號進行添加。 xu645352780