WeChatアプレット-ユーザーsession_を取得するkey,openid-バックエンドはnodejs,Kooa 2フレームです.

4606 ワード

これはcsdnでの最初の文章です.他の人の文章をたくさん読みました.
最近はプログラムを書いています.ゼロNodejsをもとに書いて、大きな穴を踏みました.もう二度とこのようなことをしません.
私の小さいプログラムはWeChatのKooa 2フレームを使っています.新規プロジェクトを作る時に開発者がツールをくれたdemoです.ウィジェットはユーザーのopenidを取得してデータベースを作成する必要があります.自分で車輪が作れないので、ネットで他の人の輪を探してみます.これは私が見つけた適当な(ブロガーの名前:意外な金喜)です.クリックしてリンクを開けてください.はっきり言って、このビームのコードをコピーします.この中には二つの穴があります.別々に話します.もし同じ状況に遭遇した人がいたら、私が書いたものをあなた達に手伝ってほしいです.
一つ目は、wx.requestの一つのバグです.
(バグではなく、書けないかもしれません.)wx.requestを使ってユーザーの登録証コードを後端に送り、ユーザーのopenidと交換します.これはWeChatからのデモです.
wx.request({
  url: 'test.php', //    ,         
  data: {
     x: '' ,
     y: ''
  },
  header: {
      'content-type': 'application/json' //    
  },
  success: function(res) {
    console.log(res.data)
  }
})
しかし、私のバックエンドはデータを受信できません.シングルステップのデバッグを起動して、consolie.logs()で何かのデータを送ってみましたが、dataというパラメータは全くないです.どうしようもなくて、模索しました.コードをheaderの中に隠して、後端コードをheadersの中のパラメータを読み取って伝参を完成することができます.以下は私のコードです.
    static request(url, params, method = "POST", type = "application/x-www-form-urlencoded") {
        console.log("        ", params);
        return new Promise((resolve, reject) => {
            let opts = {
                url: url,
                method: method,
                header: { 
                    'Content-Type': type,
                    'accept': params,  
                    },
                success: resolve,
                fail: reject
            }
            console.log("   URL", opts.url);
            wx.request(opts);
        });
    };
第二に、枠が違っています.文法が違います.
意外にも金喜はExpressの枠组みを使っていますので、小プログラムのKooaとは少し违います.このわずかな违いが长い间、廖雪峰先生の教程を読んでやっと気づいた(リンクをクリックして)、この话は私たちに、もしdebugが必要ならば、公式のドキュメントやフレームのソースコードを読むのが役に立つと诉えています.
以下は意外な金喜のコードです.
router.post("/openid", async (req, res) => {
  const Ut = require("../common/utils");
  try {
    console.log(req.body);
    let appId = "wx70xxxxxxbed01b";
    let secret = "5ec6exxxxxx49bf161a79dd4";
    let { js_code } = req.body;
    let opts = {
      url: `https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${secret}&js_code=${js_code}&grant_type=authorization_code`
    }
    let r1 = await Ut.promiseReq(opts);
    r1 = JSON.parse(r1);
    console.log(r1);
    res.json(r1);
  }
  catch (e) {
    console.log(e);
    res.json('');
  }
})
問題はasync(req,res)にあります.これはexpressの書き方ですが、KKAではここのパラメータは違います.KKAの書き方は async(req,res) 
  ,  ctx  koa      request response   ,         request response,next koa               。
上記の数字は廖雪峰先生が書いたものです.意外な金喜のコードをそのまま運ぶと、「res.json is not a function」と間違えます.res.jsonはexpressのものですから、Kooの中にはありません.
そこで私はルートのコードを変更しました.
router.post("/openid", async function (ctx, next) {
    const Ut = require("../common/utils");
    console.log('ctx.response: ', ctx.response)
    console.log('ctx.request: ', ctx.request)
    try {
        let grant_type = 'authorization_code'
        let appid = config.appId
        let secret = config.appSecret
        let code = ctx.accept.headers.accept
        console.log('req code: ', code);
        let opts = {
            url: 'https://api.weixin.qq.com/sns/jscode2session?appid=' + appid + '&secret=' + secret + '&js_code=' + code + '&grant_type=' + grant_type
        }
        let r1 = await Ut.promiseReq(opts);
        r1 = JSON.parse(r1);
        console.log('r1 is:', r1);
        openid = r1.openid
        ctx.response.body = openid
    }
    catch (e) {
        console.log(e);
        ctx.response.status = 403
    }
})
res.jsonをctx.reponse.bodyに変更すればいいです.
運転結果は以下の通りです.
login     code: 061iT8Hv1VtW0b07dWHv1m3SGv1iT8Hj
appservice?t=1530270757816:1084 Fri Jun 29 2018 19:12:42 GMT+0800 (China Standard Time)     
wechat.js? [sm]:59 getUserInfo   {errMsg: "getUserInfo:ok", rawData: "{"nickName":"     ","gender":1,"language":"en","ci…rkwjS4R0jca8z8mMXGZ7fwFd9DXsfZY9podNmKh3gGQ/132"}", userInfo: {…}, signature: "a6ea2264b97da6813dff42d6f7ea24969e68490b", encryptedData: "cCrJ0XjJhmmqJWQ0ry3vqebd7Hv6Ixx2p8DMaUwW0YFMGWFqK7…48onyskBK8jwRzGdakk9naOmLXd1paEWYGebEtwldjbTyg/Q=", …}
wechat.js? [sm]:29         :  061iT8Hv1VtW0b07dWHv1m3SGv1iT8Hj
wechat.js? [sm]:42    URL:  https://cevgpypz.qcloud.la/weapp/openid
index.js? [sm]:102       openid:  ovvsAxxxxxp9blJ-XvmOxxxxxu2c