我們知道openid是微信用戶驗證的重要標識,支付功能嚴重依賴這個東西,之前我們做微信支付的時候是通過在微信客戶端直接調用官方接口,通過傳code參數來調用,下面這樣
getOpenId(){ //獲取用戶的openid
let _this=this;
wx.login({
success(res) {
if (res.code) {
// 發起網絡請求
wx.request({
url: 'https://api.weixin.qq.com/sns/jscode2session',
data: {
appid:appId, //開發者appid
secret:secret, //開發者AppSecret(小程序密鑰)
grant_type:"authorization_code", //默認authorization_code
js_code: res.code //wx.login登錄獲取的code值
},
success(res) {
_this.userinfo.openid=res.data.openid;
_this.userinfo.session_key=res.data.session_key;
}
})
} else {
console.log('登錄失??!' + res.errMsg)
}
}
})
}
這樣做理論上也可以拿到openid,但是這里有一個神坑,就是在小程序開發者工具直接測試,使用真機調試,都沒有任何問題,但是一旦上傳代碼,使用小程序的體驗版測試的話,就拿不到openid,奇怪的是,如果在體驗版開啟調試模式,又可以拿到,這是一個非常腦殘的問題,直接影響就是開發環境和生產環境在代碼相同的情況下,體現的效果不一樣,微信官方也沒有任何合理解釋,經過很長時間的查找資料,獲取openid不能直接在微信客戶端來獲取,應該改用后端來獲取openid然后再返回給前端。
所以應該用Django來獲取openid
def getopenid(request):
res = {}
appId = request.GET.get('appId')#開發者appid
secret = request.GET.get('secret')#開發者AppSecret(小程序密鑰)
grant_type = "authorization_code" #默認authorization_code
js_code = request.GET.get('js_code')#wx.login登錄獲取的code值
data = {'appId':appId,'secret':secret,"grant_type":grant_type,"js_code":js_code}
url = "https://api.weixin.qq.com/sns/jscode2session"
jscode = requests.get(url,data)
res = jscode.json()
return JsonResponse(res,safe=False,json_dumps_params={'ensure_ascii':False})
而前端獲取openid的方法改造成請求本地接口
getOpenId(){ //獲取用戶的openid
let _this=this;
wx.login({
success(res) {
if (res.code) {
// 發起網絡請求,改造成請求本地接口獲取openid,規避體驗版獲取不到的問題
wx.request({
url: 'http://localhost:8000/getopenid',
data: {
appid:appId, //開發者appid
secret:secret, //開發者AppSecret(小程序密鑰)
grant_type:"authorization_code", //默認authorization_code
js_code: res.code //wx.login登錄獲取的code值
},
success(res) {
_this.userinfo.openid=res.data.openid;
_this.userinfo.session_key=res.data.session_key;
}
})
} else {
console.log('登錄失?。? + res.errMsg)
}
}
})
}
至此才解決了這個問題,這件事情說明一個問題,就是做任何事情都不能想當然,同時開發小程序的時候,真機測試沒有問題并不代表沒有問題,一定要到生產環境測一下,另外最后一個忠告,微信小程序獲取openid一定要在server端獲取再返回給前端,千萬不要圖省事在前端直接獲取openid