[教程]教你如何快速开发与分析微信小程序项目

在写这篇教程前我有去看简书上的其他微信小程序相关教程,发现有很多关于小程序的基础教程,所以我这篇教程就不从基础开始了,这篇教程分享了我在开发过程中的一些开发经验,适合有一定javascript基础,最好了解后台开发的同学。

需求分析

开发项目前要把项目需求理顺、理清这是首当其冲要做的事情,在我开发的项目当中拿 高人汇 为例,高人汇项目的业务逻辑很多接口都需要 uid 和 token,所以第一步要从登录和存储全局信息开始,这里说一下高人汇项目是有 ios 和 android 两端app的,小程序端要利用微信开发平台 unionId 来实现同步信息,通过小程序API中的 wx.getUserInfo 方法获取到 unionId 来实现自动登录。登录后获取用户的部分数据作为全局变量存储,有了必要的数据,接下来请求其他接口和对业务逻辑就会相对清晰。

项目登录流程图(图1)

在 图1 中我们看到当用户拒绝授权是获取不到 unionId 的,当用户拒绝微信授权时微信会返回错误状态码:-12006,利用这个状态码来判断用户是否授权,值得注意的是目前为止, 微信开发者工具并不返回这个错误状态码,只有在真机上才有返回。

首先要配置一个全局请求接口的连接地址,这样便于生产环境与测试环境的切换。

(图2)

新建一个js文件用来配置全局的接口请求链接地址,baseUrl.js如下:

//baseUrl.js
module.exports = {
    apiUrl:'https://api.baidu.com/index.php?m=model&c=controller&a=',
    imgUrl:'http://img.baidu.com',
    payUrl:'https://api.baidu.com/index.php?m=model&c=controller&a=pay'
}

在app.js中引入一次即可,在app.js需要设置一个全局变量,因个人习惯全局变量名这里我设置为_G,代码如下

//app.js
var $url = require('/utils/baseUrl.js');
var $util = require('/utils/util.js');
App({
    _G:{
        apiUrl: $url.apiUrl,
        imgUrl: $url.imgUrl,
        payUrl: $url.payUrl,
        wxInfo: {},
        userInfo:{},
        shareTitle: '测姻缘桃花,算事业财运',
        shareDesc: '最靠谱的命理占卜师在线解答,10分钟快速响应!占卜问事、起名择吉看风水。'
    },
    ....

这样在其他页面通过 getApp() 函数得到小程序实例从而得到接口url。

在上面的代码中也引入 util.js, 这个js是用来写一些常用的工具函数,提到 util.js 那现在就首先编写一个用来统一设置全局数据的方法函数,在 图1 了解到有四处地方可以获取到的用户数据分别为:自动登录、主动登录、绑定账户和用户注册,这四处获取到的数据有部分数据是需要设置全局变量和全局存储的,为了方便有必要写这个方法函数,代码如下

//util.js
/**
 * 设置用户信息缓存
 */
function setDataStorage(d,g) {
    data = d.data;
    //设置全局变量
    g._G.userInfo = {
        avatar: data.avatar,
        nickname: data.nickname,
        mobile: data.mobile,
        balance: data.balance,
        credit: data.credit,
    }
    wx.setStorageSync('userInfo',{
        uid: data.uid,
        NickName: data.nickname,
        mobile: data.mobile,
        avatar: data.avatar
    });
   
    wx.setStorageSync('openid', data.openid);
    wx.setStorageSync('uid',data.uid);
    wx.setStorageSync('token',data.token);
}

module.exports = { 
  setDataStorage: setDataStorage
}

setDataStorage 方法函数 g 参数是通过 getApp() 函数得到小程序实例,这样同步更新全局_G变量,在之后会用来更新用户信息,例如:用户余额和用户积分的变化。

前期的准备工作先到这里,接下来要编写用户登录方法函数,之后会很多地方需要调用这个登录方法函数。

为了方便我是在app.js中创建的login方法函数,代码如下

  //全局登录函数
    login:function(fmurl,func){
        var that = this;
        
        //调用登录接口
        wx.login({
          success: function (res) {

            if(res.code){
              
                wx.getUserInfo({
                    withCredentials:true,
                    success: function (r) {
                        wx.showLoading({
                            title: '加载中',
                        })
                        wx.request({
                            url: $url.apiUrl + 'appletLogin', 
                            method:'POST',
                            data: {
                                code: res.code,
                                rawdata: r.rawData,
                                signature: r.signature,
                                cryptedata: r.encryptedData,
                                iv: r.iv,
                            },
                            header: {
                                'content-type': 'application/x-www-form-urlencoded'
                            },
                            success: function(result) {
                                var dt = result.data;
                                wx.setStorageSync('unionId',dt.data.unionId);
                               
                                //未绑定手机号
                                if(dt.result == 40040){
                                    wx.redirectTo ({
                                        url:'/pages/member/bound/bound?fmurl=' + fmurl,
                                    });
                                    return false;
                                }

                                if(dt.result != 1){
                                    wx.showModal({
                                        title: '系统提示',
                                        content: dt.msg,
                                        showCancel:false,
                                    })
                                    return false;
                                }

                                //设置缓存
                                $util.setDataStorage(dt,that);
                                
                                wx.showToast({
                                    title: '登录成功',
                                    icon: 'success',
                                    duration: 1500,
                                })

                               //执行回调
                                if(typeof func == 'function'){
                                    func(dt.data);
                                }
                                console.log(dt)
                                return dt;
                            },
                            fail: function(e){
                                wx.hideLoading();
                                wx.showModal({
                                    title: '系统提示',
                                    content: '请求超时,请稍后再试',
                                    showCancel: false,
                                })
                            }

                        })

                    },
                    complete: function(obj){//处理用户拒绝授权
                        if(obj.err_code == '-12006'){
                            wx.redirectTo({
                                url: '/pages/member/login/login'
                            })
                            return false;
                        }
                    }

                })


            }else{
              console.log('获取code失败')
            }

          }

        })


    },

大家要注意这个login方法函数,是由两个小程序函数和一个开发者服务器接口构成的, wx.login() 、 wx.getUserInfo()函数 和 appletLogin接口。

通过两个小程序函数获得的 code 、rawdata、signature、encryptedData、iv,数据后调用开发者服务器 appletLogin接口,将encryptedData 进行解密得到 openId 和 unionId后,appletLogin接口内部调用开发者服务器登录接口,获取用户数据进行返回。

拿到返回的用户数据再调用教程上面刚刚写的 setDataStorage() 函数,进行设置全局变量和全局数据存储。

在这里简单的说一下开发者服务器端逻辑,因为高人汇项目还有APP端,所以服务器端应该有四个相关接口:

  • 微信小程序登录接口(需要解密 encryptedData)
  • 第三方登录\绑定账号(可通过unionId登录的接口)
  • 登录接口
  • 注册接口

来看一下 login 方法函数,函数调用开发者服务器 appletLogin接口时,服务器返回错误码40040(这个错误码要根据自己服务器返回值去处理)表示该微信用户未绑定账号(unionId不匹配)或未注册,这时程序会跳转到(图3)绑定已有账号或注册页面。

绑定账号(图3)

登录页面(图4)

再来看一下 wx.login() 函数中的 complete 回调函数判断了用户拒绝微信授权的处理,当用户拒绝微信授权时会返回错误状态码:-12006(目前微信开发者工具是不返回这个错误码的,只能到真机测试),根据这个错误码判断,未授权直接跳转到(图4)登录页面。

这样整个小程序项目的登录逻辑就清晰了,那接下来应该编写:绑定账号、注册 和 用户主动登录等页面与代码逻辑了。

高人汇小程序,大家可以扫描体验

这篇教程先写到这里,之后会陆续更新我在高人汇项目中得到的开发经验与一些开发技巧。

在文章教程中也许会出现一些纰漏,大家也可以在下方留言给予指出,大家一同交流和学习。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容