小さいプログラムのNodeJsバックグランドはどのようにOpenId、Union IDとencrypetedDataを獲得しますか?

10077 ワード

最近はプログラムを振り回していますが、Kooa 2フレームのバックグラウンドを使って各種データの取得方法をテストしています.わざわざOpenId、UnionIDの取得方法を書きに来ました.
まずユニオンIDの取得方法を見てみます.
開発者アカウントを紐付けたウィジェットは、以下のルートでUnionIDを取得することができます.
  • はインターフェースwx.getUserInfoを呼び出し、解読データからユニオンIDを取得する.注意このインターフェースはユーザの授権が必要です.開発者はユーザが授権を拒否した後の状況を適切に処理してください.
  • 開発者アカウントの下に同じ主体の公衆番号が存在する場合、ユーザはこの公衆番号に注目している.開発者は直接wx.login+code 2 Sessionを通じてこのユーザUnion IDを取得できます.ユーザが再度認証する必要はありません.
  • 開発者アカウントの下に同じホストの公衆番号またはモバイルアプリケーションが存在する場合、ユーザは、パブリック番号またはモバイルアプリケーションにログインすることを許可しました.開発者は、ユーザが再度認証する必要がなく、wx.login+code 2 Sessionから直接にユーザUnionIDを取得することもできる.
  • ユーザは、アプレット(ミニゲームは一時的にサポートされていません)で支払いが完了したら、開発者は直接にgetPaidUnionIdインターフェースを介してユーザのUnionIDを取得してもよく、ユーザの許可が必要ではありません.注意:このインターフェースはユーザが支払った後の5分間だけ有効です.開発者が適切に処理してください.
  • ウィジェットがクラウド関数を呼び出した場合、開発者アカウントの下に同本体の公衆番号が存在し、ユーザは既にこの公衆番号に注目しており、クラウド関数の中でクラウド.getWXContextでUnionIDを取得することができる.
  • ウィジェットがクラウド関数を呼び出した場合、開発者アカウントの下に同じ本体の公衆番号またはモバイルアプリケーションが存在し、ユーザはこの公衆番号またはモバイルアプリケーションに登録することを許可しました.クラウド関数の中でクラウド.getWXContextを通じてUnionIDを取得することもできます.
  • つまり、開発者アカウントを紐付けたウィジェットはUnionIDを取得できません.
    取得方法:
    wx.login+code 2 Session:
    OpenId、UnionID取得には、バックグラウンドでWeChatサーバにウィジェットに属するappId、AppSecret、jsCodeを送信する必要があります.
    このうちappIdは、AppSecretがウィジェットの管理バックグラウンドで取得し、jsCodeはwx.login()を使って取得します.
    コード:
    
    const koa2Req = require('koa2-request'); //    
    let appId = 'xxxxx',
    AppSecret = 'xxxx';
    
    module.exports = async ( ctx )=> {
    	let { code } = ctx.request.body; //  post   jscode
    	
    	//           OpenId
    	let qres = await await koa2Req({
        	url: `https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${AppSecret}&js_code=${code}&grant_type=authorization_code`
      	})
    	let body = JSON.parse(qres.body); //   
    	ctx.state.body = body // OpenId         ,         
    }
    
    データの復号方式
    上の部分と同じように、open-typeがgetsUserInfoボタンで取得されたencrypttedDataとivをバックグラウンドに送信して解読する必要があります.
    バックグラウンドコードは以下の通りです.
    let WXBizDataCrypt = require('../WXBizDataCrypt'); //     ,https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html     
    const koa2Req = require('koa2-request'); //    
    let appId = 'xxxxx',
    AppSecret = 'xxxx';
    let { code, encryptedData, iv} = ctx.request.body; //   code, encryptedData, iv
    
    const qres = await koa2Req({
       url: `https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${AppSecret}&js_code=${code}&grant_type=authorization_code`
    })
    
    let body = JSON.parse(qres.body); 
    let { session_key } = body; //    session_key
    
    
    //            + ,        ,     +      。
    encryptedData = encryptedData.replace(/ /g,'+')
    iv = iv.replace(/ /g,'+');
    
    var pc = new WXBizDataCrypt(appId, body.session_key);  //       
    var encodedata = pc.decryptData(res.encryptedData,res.iv); //        
    
    ctx.state.body = encodedata //