我們知道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