微信小程序【Promise】 通过code请求开发服务器获取openid实例

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/abs1004/article/details/90478674

功能分析:多次回调,用Promise来简化流程

app.js 内添加如下代码

	/**
     * 获取微信code
     * Promise
     * 用于后续换取openid等操作
     * @resolve {String} code
     * @reject {String} 错误提示
     */ 
    getWxCodePromise: function () {
        return new Promise((resolve, reject) => {
            //init
            wx.login({
                success: res => {
                    if (res.code){
                        resolve(res.code);
                    }else{
                        reject('code 获取失败: ' + res.errMsg); 
                    }
                },
                fail: err => {
                    reject('code 获取失败: ' + err);
                },
            });
        });
    },
    /**
     * 通过code获取openid
     * Promise
     * @param {String} code 微信code
     * @resolve: {ArrayObject} 返回数组,包含两个参数:openid,token
     * @reject: {String} 错误提示
     */
    getOpenidPromise: function (code) {
        var postData = {
            code: code
        };
        var that = this;
        // postData.signature = this.makeSign(postData); // 追加签名,非必要,看后台接口的要求
        return new Promise((resolve, reject) => {
            wx.request({
                url:  "https://xxx.com/user/wxLogin",// 这里改成实际api接口网址
                data: postData,
                method: 'POST',
                header: {
                    'content-type': 'application/x-www-form-urlencoded'
                },
                success: function (res) {
                    // console.log(res.data);
                    //全局变量
                    if (res.data.status == 1) { // 改成实际接口的成功code
                        var respData = res.data.data;
                        console.log('openid=' + respData.openid + ',  token=' + respData.token);
                        var userInfo = { "openid": respData.openid, "token": respData.token};
                        resolve(userInfo)
                    } else {
                        console.log('openid 获取失败' + respData.info);
                        reject('openid 获取失败' + respData.info);
                    }
                },
                fail: function (err) {
                    console.log('openid 获取失败: ' + err);
                    reject('openid 获取失败: ' + err);
                }
            })
        });
    },
    /**
     * 更新缓存用户uid,openid
     * @param {ArrayObject} userInfo
     *  	userInfo.openid {String} 小程序用户的openid,可以为空字符串(空字符串表示清空缓存)
     *  	userInfo.token  {String}  用户令牌,可以为空字符串(空字符串表示清空缓存)
     */
    updateUserCatch: function (userInfo) {
        //本地存储
        try {
            wx.setStorageSync('token', userInfo.token);
            wx.setStorageSync('openid', userInfo.openid);
            console.log(userInfo);
            console.log('user catch update success');
        } catch (e) {
            console.log('user catch update fail: ' + e.errMsg);
        }
    },

调用方法,在需要的界面链式调用,比如Home.js内

//pages/shop/home.js

//获取应用实例
const app = getApp();
Page({
	data:{},
	onLoad: function(){
	},
	
	// ... other code
	
	//这里通过code,换取token及openid,并且存在localStorage里
	test: function () {
        app.getWxCodePromise().then( // getWxCodePromise 的成功返回值code作为参数传给getOpenidPromise
            app.getOpenidPromise
        ).then(  // getOpenidPromise 的成功返回值userInfo作为参数传给updateUserCatch
            app.updateUserCatch
        ).catch( // 捕获并打印错误信息
        	function(err){
        		console.log('test() fail: ' + err);
        	}
        );
    },
})
展开阅读全文

没有更多推荐了,返回首页