微信小程序調用後端接口獲取openid,api.weixin.qq.com不能設置安全域名

 今天在寫項目時,用到微信小程序授權獲取openid的需求,然後在網上找了下,很快就寫出來了,也獲取到了openid(前提是要將微信開發工具--詳情裏面的不檢驗合法域名花√,這樣纔可以),然後代碼如下(代碼是在app.js裏面寫,進入項目時就執行):

//app.js
App({
  //onLaunch,onShow: options(path,query,scene,shareTicket,referrerInfo(appId,extraData))
  onLaunch: function() {
    // const { code } = await login();
    wx.login({
      success: function (res) {
        var code = res.code;
        if (res.code) {
          //發起網絡請求
          wx.request({
            url: `https://api.weixin.qq.com/sns/jscode2session?appid=小程序後臺的appid&secret=小程序後臺的secret&js_code=${code}&grant_type=authorization_code`,
            success:function(response){
              console.log('openid:' + response.data.openid);
            },
          })
        } else {
          console.log('獲取用戶登錄態失敗!' + res.errMsg)
        }
      }
    });
  },
  onShow: function(options) {

  },
  onHide: function() {

  },
  onError: function(msg) {

  },
  //options(path,query,isEntryPage)
  onPageNotFound: function(options) {

  }
});

 以上是已經實現了小程序獲取openid的問題,要將api.weixin.qq.com添加到後臺的安全域名中,發現不能行,果然心急吃不了熱豆腐,是因爲這種方式,很容易讓有心之人拿到secret,不太友好,所以需要讓後端通過接口來進行訪問這個鏈接,將獲取到的openid返回給前端,下面是通過後端拿到openid的代碼,也需要在app.js中寫

request目錄下index.js文件內容:


// 同時發送異步代碼的次數
let ajaxTimes=0;
export const request=(params)=>{
  // 判斷 url中是否帶有 /my/ 請求的是私有的路徑 帶上header token
  let header={...params.header};
  if(params.url.includes("/my/")){
    // 拼接header 帶上token
    header["Authorization"]=wx.getStorageSync("token");
  }


  ajaxTimes++;
  // 顯示加載中 效果
  wx.showLoading({
    title: "加載中",
    mask: true
  });
    

  // 定義公共的url
  const baseUrl="項目基本目錄";
  return new Promise((resolve,reject)=>{
    wx.request({
     ...params,
     header:header,
     url:baseUrl+params.url,
     success:(result)=>{
       resolve(result.data);
     },
     fail:(err)=>{
       reject(err);
     },
     complete:()=>{
      ajaxTimes--;
      if(ajaxTimes===0){
        //  關閉正在等待的圖標
        wx.hideLoading();
      }
     }
    });
  })
}

第一種方法:可以直接拿到openid     app.js文件中

import { request } from "./request/index.js";
//app.js
App({
  //onLaunch,onShow: options(path,query,scene,shareTicket,referrerInfo(appId,extraData))
  onLaunch: function() {
    const _this = this
    wx.login({
      success: function (res) {
        var code = res.code;
        console.log(code)
        _this.getOpenid(code)
      }
    });
  },
  async getOpenid (val) {
    const getOpenidParams = {code: val}
    //  3 發送請求 獲取用戶的openid
    const res = await request({url:"/user/getXCXOpenid",data:getOpenidParams});
    const openid = JSON.parse(res.data).openid
    console.log('resp', JSON.parse(res.data).openid)
    wx.setStorageSync("openid", openid);
  },
  onShow: function(options) {

  },
  onHide: function() {

  },
  onError: function(msg) {

  },
  //options(path,query,isEntryPage)
  onPageNotFound: function(options) {

  }
 
});
  

第二種方法:

util文件夾下asyncWx.js文件內容:

/**
 * promise 形式  login
 */
export const login=()=>{
  return new Promise((resolve,reject)=>{
    wx.login({
      timeout:10000,
      success: (result) => {
        resolve(result);
      },
      fail: (err) => {
        reject(err);
      }
    });
  })
}
import { request } from "./request/index.js";
import { login } from "./utils/asyncWx.js";
//app.js
App({
  //onLaunch,onShow: options(path,query,scene,shareTicket,referrerInfo(appId,extraData))
  onLaunch: function() {
    this.getOpenid()
  },
  async getOpenid () {
    const { code } = await login();
    console.log('code:', code)
    const getOpenidParams = {code: code}
    const resp = request({url:"/user/getXCXOpenid",data:getOpenidParams});
    console.log('resp', resp)
  },

  onShow: function(options) {
  
  },

但是這種方法,返回的resp格式是以下這樣,我還不清楚如何解析拿到openid,等我之後研究出來了,再編輯這篇文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章