我們知道openid是微信用戶驗(yàn)證的重要標(biāo)識(shí),支付功能嚴(yán)重依賴這個(gè)東西,之前我們做微信支付的時(shí)候是通過(guò)在微信客戶端直接調(diào)用官方接口,通過(guò)傳code參數(shù)來(lái)調(diào)用,下面這樣
getOpenId(){ //獲取用戶的openid let _this=this; wx.login({ success(res) { if (res.code) { // 發(fā)起網(wǎng)絡(luò)請(qǐng)求 wx.request({ url: 'https://api.weixin.qq.com/sns/jscode2session', data: { appid:appId, //開(kāi)發(fā)者appid secret:secret, //開(kāi)發(fā)者AppSecret(小程序密鑰) grant_type:"authorization_code", //默認(rèn)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) } } }) } 復(fù)制代碼
這樣做理論上也可以拿到openid,但是這里有一個(gè)神坑,就是在小程序開(kāi)發(fā)者工具直接測(cè)試,使用真機(jī)調(diào)試,都沒(méi)有任何問(wèn)題,但是一旦上傳代碼,使用小程序的體驗(yàn)版測(cè)試的話,就拿不到openid,奇怪的是,如果在體驗(yàn)版開(kāi)啟調(diào)試模式,又可以拿到,這是一個(gè)非常腦殘的問(wèn)題,直接影響就是開(kāi)發(fā)環(huán)境和生產(chǎn)環(huán)境在代碼相同的情況下,體現(xiàn)的效果不一樣,微信官方也沒(méi)有任何合理解釋,經(jīng)過(guò)很長(zhǎng)時(shí)間的查找資料,獲取openid不能直接在微信客戶端來(lái)獲取,應(yīng)該改用后端來(lái)獲取openid然后再返回給前端。
所以應(yīng)該用Django來(lái)獲取openid
def getopenid(request): res = {} appId = request.GET.get('appId')#開(kāi)發(fā)者appid secret = request.GET.get('secret')#開(kāi)發(fā)者AppSecret(小程序密鑰) grant_type = "authorization_code" #默認(rèn)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}) 復(fù)制代碼
而前端獲取openid的方法改造成請(qǐng)求本地接口
getOpenId(){ //獲取用戶的openid let _this=this; wx.login({ success(res) { if (res.code) { // 發(fā)起網(wǎng)絡(luò)請(qǐng)求,改造成請(qǐng)求本地接口獲取openid,規(guī)避體驗(yàn)版獲取不到的問(wèn)題 wx.request({ url: 'http://localhost:8000/getopenid', data: { appid:appId, //開(kāi)發(fā)者appid secret:secret, //開(kāi)發(fā)者AppSecret(小程序密鑰) grant_type:"authorization_code", //默認(rèn)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) } } }) } 復(fù)制代碼
至此才解決了這個(gè)問(wèn)題,這件事情說(shuō)明一個(gè)問(wèn)題,就是做任何事情都不能想當(dāng)然,同時(shí)開(kāi)發(fā)小程序的時(shí)候,真機(jī)測(cè)試沒(méi)有問(wèn)題并不代表沒(méi)有問(wèn)題,一定要到生產(chǎn)環(huán)境測(cè)一下,另外最后一個(gè)忠告,微信小程序獲取openid一定要在server端獲取再返回給前端,千萬(wàn)不要圖省事在前端直接獲取openid