填坑記錄:1.個人微信公眾訂閱號是不能申請微信認證的。公眾號的類型在注冊時一旦選擇就不能更改,微信公眾號認證的功能除個人訂閱號外,都可以申請認證,因而個人訂閱號不能申請認證。這句話的意思就是個人訂閱號無法開發小程序。
2.個體戶營業執照(個體戶)可申請微信服務號並申請開發小程序,但需微信認證復用資質並用新郵箱注冊小程序賬號
3.微信開發工具創建微信小程序填寫的appid是小程序的appid(不是微信公眾號的),不能是個人小程序的appid,個人小程序沒有獲取用戶信息的權限
4.調用接口獲取用戶信息時填寫的appid要與創建時填寫的一樣
5.openid只能后台獲取,提高安全性
6.只獲取openid,只調用wx.login獲取code交給后台即可,如果還要獲取用戶詳細信息還要接着調用wx.getUserInfo獲取encryptedData,iv提交后台解密用戶信息
解密方法官方文檔:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html
小程序代碼:
//登錄獲取code login: function () { //1、調用微信登錄接口,獲取code wx.login({ success: function (r) { var code = r.code;//登錄憑證 if (code) { //2、調用獲取用戶信息接口 wx.getUserInfo({ success: function (res) { //3.請求自己的服務器,解密用戶信息 獲取unionId等加密信息 wx.request({ url: app.globalData.loginWXUrl,//自己的服務接口地址 method: 'post', header: { 'content-type': 'application/json' }, data: { encryptedData: res.encryptedData, iv: res.iv, code: code }, success: function (res) { //4.解密成功后 獲取自己服務器返回的結果 if (res.data.return_code == 0) { console.log(res.data.data) } else { console.log('解密失敗') } }, fail: function () { console.log('系統錯誤') } }) }, fail: function () { console.log('獲取用戶信息失敗') } }) } else { console.log('獲取用戶登錄態失敗!' + r.errMsg) } }, fail: function () { console.log('登陸失敗') } }) }
python后台代碼:
@app.route('/code', methods=["POST"]) def get_code(): JSCODE = request.get_json()["code"] encryptedData = request.get_json()["encryptedData"] iv = request.get_json()["iv"] APPID = "小程序appid" SECRET = "小程序secret" url = 'https://api.weixin.qq.com/sns/jscode2session?appid={appid}&secret={secret}&js_code={code}&grant_type=authorization_code'.format(appid=APPID,secret=SECRET,code=JSCODE) res = requests.get(url) openid = res.json().get('openid') session_key = res.json().get('session_key') pc = WXBizDataCrypt(APPID, session_key) data = pc.decrypt(encryptedData, iv) #data中是解密的用戶信息 return json_response(0,data=data)
WXBizDataCrypt中具體解密方法下載官方多種語言示例代碼:https://res.wx.qq.com/wxdoc/dist/assets/media/aes-sample.eae1f364.zip
如果導包出現 from Crypto.cipher import AES錯誤
python 在 Windows下使用AES時要安裝的是pycryptodome 模塊 pip install pycryptodome
python 在 Linux下使用AES時要安裝的是pycrypto模塊 pip install pycrypto