精华内容
下载资源
问答
  • 微信小程序实现微信登录(Java后台)

    万次阅读 多人点赞 2018-12-13 19:51:38
    这两天在自己的小项目中加入了微信小程序的很多功能,今天来说一下关于微信授权登录的部分。 需要的材料 1:一个可以测试的微信小程序 2:此微信小程序的APPID和APPscret 流程 微信用户对应一个小程序都有一个...

    这两天在自己的小项目中加入了微信小程序的很多功能,今天来说一下关于微信授权登录的部分。

    需要的材料

    1:一个可以测试的微信小程序

    2:此微信小程序的APPID和APPscret

    流程

    微信用户对应一个小程序都有一个唯一的openid,微信授权登录,微信授权登录的核心就是获取这个openid并存在数据库作为用户存在的唯一标识。微信授权登录的流程大体分为两步

    1.微信小程序前端获取code并发送到后台

    在微信小程序的前端调用wx.login()获取一个code,这个code就像是我们去微信后台服务器获取用户信息的一个钥匙,微信通过获取这个code的过程给用户一个选择是否授权的选择,如果用户选择了授权就会返回一个code。这个code是一次性的,也是有时限的,代码如下。

        //请求code
        wx.login({
          success(res) {
            if (res.code) {
                 //把获取到的code通过一个request的请求发给java服务器
                wx.request({
                url:你的url地址,
                data: {
                  code: res.code
                },  
                method: 'POST',
                dataType: 'json',
                success: function (res) {
                    //请求成功的处理
                }
            }
          },
          fail: function () {
            console.log("发送code失败:", res.data);  
          }
        })
    

    2.后台接收code并通过code拉取用户的openid

    后台接受了code以后通过建立一个http请求去访问微信后台服务器拉取这个用户的openid,如果一切正常就会得到这个用户对应这个小程序的openid和用户个人的Access_token(和微信小程序的Access_Token不一样)。

    请求的地址:

    https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

    通过GET方式访问,其中的参数分别是:

    appid:小程序的appid

    secret:小程序的appsecret

    js:小程序前端传来的code

    grant_type:这个不用修改,表示授权的类型

    <!-- http请求工具包依赖 -->
    <dependency>
    	<groupId>org.apache.httpcomponents</groupId>
    	<artifactId>httpclient</artifactId>
    	<version>4.5.2</version>
    </dependency>
    //获取openid
    public static Map<String, Object> getWxUserOpenid(String code, String APPID, String APPSecret) {
        //拼接url
    	StringBuilder url = new StringBuilder("https://api.weixin.qq.com/sns/jscode2session?");
    	url.append("appid=");//appid设置
    	url.append(APPID);
    	url.append("&secret=");//secret设置
    	url.append(APPSecret);
    	url.append("&js_code=");//code设置
    	url.append(code);
    	url.append("&grant_type=authorization_code");
    	Map<String, Object> map = null;
    	try {
            HttpClient client =HttpClientBuilder.create().build();//构建一个Client
            HttpGet get = new HttpGet(url.toString());    //构建一个GET请求
            HttpResponse response = client.execute(get);//提交GET请求
            HttpEntity result = response.getEntity();//拿到返回的HttpResponse的"实体"
            String content = EntityUtils.toString(result);   
            System.out.println(content);//打印返回的信息
            JSONObject res = JSONObject.fromObject(content);//把信息封装为json
    	    //把信息封装到map
    	    map = MdzwUtils.parseJSON2Map(res);//这个小工具的代码在下面
    	} catch (Exception e) {
    	    e.printStackTrace();
    	}
        return map;
    }
    //json转map,这个小工具是我从网上找的,谢谢作者
    public static Map<String, Object> parseJSON2Map(JSONObject json) {
            Map<String, Object> map = new HashMap<String, Object>();
            // 最外层解析
            for (Object k : json.keySet()) {
                Object v = json.get(k);
                // 如果内层还是数组的话,继续解析
                if (v instanceof JSONArray) {
                    List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
                    @SuppressWarnings("unchecked")
    				Iterator<JSONObject> it = ((JSONArray) v).iterator();
                    while (it.hasNext()) {
                        JSONObject json2 = it.next();
                        list.add(parseJSON2Map(json2));
                    }
                    map.put(k.toString(), list);
                } else {
                    map.put(k.toString(), v);
                }
            }
            return map;
    }  
    

    返回的数据

    通过上面的代码,我们就可以拿到返回的数据转为的Map返回了。之后的逻辑代码我就不贴了,每个人的都不同,我说一下我的思路。这里我只用到了openid,在业务代码中从map中获取openid,如果成功获取就通过这个openid查询数据库,如果没有找到相应的记录,就说明这个用户第一次登录,我就为他创建一个新账户,并把账户的userid和这个openi做一个关联存到另外一张表中,为什么不把openid也存到账户的信息表中呢?把openid和用户信息分开保存,以后如果项目做平台移植时更方便。存完表之后把这个openid对应的账户标记为登录状态,然后把相应的用户信息和sessionid(或者token,根据你具体的实现方式)返回。

    这就是用户微信第一次授权,相当于是一个注册的过程。

    如果从Map中得到的openid已经在数据库中有记录的话,说明此用户已经注册过了,这时就把openid对应的用户信息和sessionid返回并把这个用户标记为登录状态就ok了。

    这时用户微信非第一次授权,相当于一个登录的过程。

    此次授权是是登录还是注册,我通过一个建立一个标识位给前端判断,前端如果通过这个标识位判断这次是注册,就继续通过wx.getUserInfo()方法拉取用户头像昵称等信息,然后通过修改用户信息的接口传到后端进行一个修改的操作。建议不要每次获取code之后就调用getUserInfo方法拉取信息然后一次性把code和用户信息传到后端,一来是用户如果进行的登录操作,微信个人信息时没有用的,增加了获取数据时间和传输时间。二是我们如果每次获取到用户信息就给他设置个人信息,这样就会覆盖用户之前的操作(比如用户之前已经修改一次头像,这时微信头像和小程序内部头像是不同的,然后用户重新登录了一下,两者的头像又一样了,这样是错误的),如果不想得到这样的结果就得再进行一次判断,增加了代码耦合度。所以登录注册应该只传code,用户的信息设置应该用另外一个接口。

    最后

    微信官方这方面的文档写的比较详细,链接:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html,只是我在做的时候也踩了不少坑,这次把微信授权登录的流程做了详细的记录,希望大家看了之后能少踩一些坑。本文也有很多不足之处,大家如果有意见和建议都可以提出来,谢谢大家。

    展开全文
  • 本文将简单介绍实现微信小程序微信登陆的基本流程 将要使用的api: wx.checkSession(Object object) wx.login(Object object) wx.getStorageSync(string key) wx.setStorageSync(string key, any data) wx.request...
    • 本文将简单介绍实现微信小程序微信登陆的基本流程
    • 将要使用的api:
      1. wx.checkSession(Object object)
      2. wx.login(Object object)
      3. wx.getStorageSync(string key)
      4. wx.setStorageSync(string key, any data)
      5. wx.request(Object object)

    首先我们可以看看官方文档的流程图。官网文档相应链接

    官方文档流程图

    ​ 流程图大概讲的是,小程序端调用wx.login获取code,然后调用wx.request进行网络请求,携带参数:code,appid,appsecret,后端用这三个参数向微信接口服务发起请求,得到session_key和openid等数据。紧接着,后端对参数进行处理,返回自定义登录状态,比如说:后端对session_key进行加密,返回加密数据给小程序端。接着,小程序端通过wx.setStorageSync对返回来的处理过的数据存入storage。之后,每当发起业务请求时,如需session_key,小程序端可以向后端传入storage中的登录态,从而获取业务数据。

    ​ 为了进一步优化用户体验,我们使用wx.checkSession对用户的session_key有效期进行检验,如图。

    优化流程

    如图,在用户点击微信登录的按钮时,我们先从storage中取自定义的登录态,如果取到了,那么就检查session_key的有效期,如若有效,则可以做其他事情,如业务请求;如若无效,那么用户调用wx.login重新登录。如果没取到自定义登录态,他么用户调用wx.login登录。

    实现代码如下:

    //点击微信登录按钮触发事件
      onLoginButton(event){
        var that = this;
        let thirdSession = wx.getStorageSync('thirdSession');
        if (thirdSession) {//如果之前有存过thirdSession
          //检查session_key是否在有效期
          wx.checkSession({
            //在有效期
            success(res) {//存储中有有自定义登录状态且在有效期
              //用自定义登录状态进行一些业务请求
              wx.request({
                url: '',
                data:{
                  thirdSession,
                }
              })
            },
            //不在在有效期,则需重新登录
            fail(err){
              //调用微信登录请求函数
              that.wechatLogin()
            }
          })
        } else {//如果之前没存过thirdSession,则需登录
          //调用微信登录请求函数
          that.wechatLogin();
        }
      },
      //微信登录请求函数
      wechatLogin(){
       wx.login({
         success(res) {
           let code = res.code;
           wx.request({
             url: '',
             data: {
               //三个登录所需参数
               appid,
               appsecret,
               code,
             },
             success(res) {
               //后端返回自定义登录状态,比如说加密过的session_key,其返回值的参数名为thirdSession
               wx.setStorageSync('thirdSession', res.data.thirdSession)
               //and do something
             }
           })
         }
       })
      }
    
    展开全文
  • 一:首先在模板文件上创建微信登录的图标 <buttonclass="login_wx"bindtap="wx_login"open-type="getUserInfo"> <view> <imagesrc="../image/wechat.png"></image> </view> <...

    一:首先在模板文件上创建微信登录的图标

    <button class="login_wx" bindtap="wx_login" open-type="getUserInfo">

        <view>

            <image src="../image/wechat.png"></image>

        </view>

        <text>微信登录</text>

    </button>

     

    二:微信小程序微信登录事件

    //微信三方登陆

        wx_login:function(){

            var app=getApp();

            var _this=this;

            // 登录

            wx.login({

                success:function(res){

                    var code=res.code;

                    //console.log("code:"+code);

                    var methodName='Login.getUnionid';

                    var unionid='';

                    var data={"code":code};

                    var wx_userinfo='';

                    var sign='';

                    var sign_data='';

                    var system='';

                    var source='';

                    util.requestData(methodName,data,function(code,msg,info){

                        unionid=info[0].unionid;

                        //console.log("unionid:"+unionid);

                        //console.log(info);

                        app.globalData.openid=info[0].openid;

                        //将openid存入缓存

                        wx.setStorageSync('openid',info[0].openid);

     

                        //获取系统消息

                        wx.getSystemInfo({

                            success (res) {

                                system=res.system;

                                if(system.indexOf("iOS")!=-1){

                                    source='ios';

                                }else if(system.indexOf("Android")!=-1){

                                    source='android';

                                }

                            }

                        });

                        wx.showLoading({

                        title: '登录中……',

                        })

                        //获取授权的微信用户信息

                        //https://developers.weixin.qq.com/community/develop/doc/0000a26e1aca6012e896a517556c01

                        wx.getSetting({

                            success: res => {

                                if (res.authSetting['scope.userInfo']) {

                                    // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框

                                    wx.getUserInfo({

                                        success: res => {

                                            // 可以将 res 发送给后台解码出 unionId

                                            // console.log("获取用户信息:");

                                            // console.log(res);

                                            // console.log(res.userInfo);

                                            wx_userinfo=res.userInfo;   

                                            //生成sign

                                            sign_data={"openid":unionid};

                                            sign=util.createSign(sign_data);

                                            //console.log(sign);

                                            _this.setData({

                                                "login_hidden":false

                                            });

                                            //调用三方登录接口

                                            methodName="Login.userLoginByThird";

                                            data={

                                                "openid":unionid,

                                                "type":"wx",

                                                "nicename":wx_userinfo.nickName,

                                                "avatar":encodeURI(wx_userinfo.avatarUrl),

                                                "sign":sign,

                                                "source":source

                                            };

     

                                            util.requestData(methodName,data,function(code,msg,info){

     

                                                //获取用户的信息

                                                var data1={

                                                    'uid':info[0].id,

                                                    'token':info[0].token

                                                };

                                                util.requestData("User.getBaseInfo",data1,function(code1,msg1,info1){

                                                    info[0].vip=info1[0].vip;

                                                    info[0].liang=info1[0].liang;

                                                    //console.log(typeof(info));

                                                    wx.setStorageSync('userinfo',info[0]);

                                                    app.globalData.userinfo=info[0];

                                                    //console.log(wx.getStorageSync("userinfo"));

                                                    //console.log(app.globalData.userinfo);

                                                    wx.hideLoading();

                                                    setTimeout(function(){

                                                        _this.setData({

                                                            "login_hidden":true

                                                        });

                                                        wx.switchTab({ 

                                                            url: '/pages/my/index',

                                                        })

                                                    },100);

                                                    

                                                    //console.log("微信登陆跳转结束");

     

                                                });

                                                

                                            });

                                        }

                                    })

                                }

                            },

     

                            fail:res=>{

                                //console.log("微信授权失败:"+res);

                            }

                        })

                    });

                }

            })

        },

     

    三:接口:

    'getUnionid' => array(
                    'code' => array('name' => 'code', 'type' => 'string','desc' => '微信code'),
                ),

     

    /**
         * 获取微信登录unionid
         * @desc 用于获取微信登录unionid
         * @return int code 操作码,0表示成功,2发送失败
         * @return array info 
         * @return string info[0].unionid 微信unionid
         * @return string msg 提示信息
         */    
        public function getUnionid(){
            
            $rs = array('code' => 0, 'msg' => '', 'info' => array());
            $code=checkNull($this->code);
            
            if($code==''){
                $rs['code']=1001;
                $rs['msg']='参数错误';
                return $rs;
                
            }

            $configpri=getConfigPri();
        
            $AppID = $configpri['wx_mini_appid'];
            $AppSecret = $configpri['wx_mini_appsecret'];
            /* 获取token */
            //$url="https://api.weixin.qq.com/sns/oauth2/access_token?appid={$AppID}&secret={$AppSecret}&code={$code}&grant_type=authorization_code";
            $url="https://api.weixin.qq.com/sns/jscode2session?appid={$AppID}&secret={$AppSecret}&js_code={$code}&grant_type=authorization_code";
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($ch, CURLOPT_URL, $url);
            $json =  curl_exec($ch);
            curl_close($ch);
            $arr=json_decode($json,1);
            //file_put_contents('./getUnionid.txt',date('Y-m-d H:i:s').' 提交参数信息 code:'.json_encode($code)."\r\n",FILE_APPEND);
            //file_put_contents('./getUnionid.txt',date('Y-m-d H:i:s').' 提交参数信息 arr:'.json_encode($arr)."\r\n",FILE_APPEND);
            if($arr['errcode']){
                $rs['code']=1003;
                $rs['msg']='配置错误';
                //file_put_contents('./getUnionid.txt',date('Y-m-d H:i:s').' 提交参数信息 arr:'.json_encode($arr)."\r\n",FILE_APPEND);
                return $rs;
            }
            
            

            /* 小程序 绑定到 开放平台 才有 unionid  否则 用 openid  */
            $unionid=$arr['unionid'];

            if(!$unionid){
                //$rs['code']=1002;
                //$rs['msg']='公众号未绑定到开放平台';
                //return $rs;
                
                $unionid=$arr['openid'];
            }
            
            $rs['info'][0]['unionid'] = $unionid;
            $rs['info'][0]['openid'] = $arr['openid'];
            return $rs;
        }

     

    'userLoginByThird' => array(
                    'openid' => array('name' => 'openid', 'type' => 'string', 'min' => 1, 'require' => true,   'desc' => '第三方openid'),
                    'type' => array('name' => 'type', 'type' => 'string', 'min' => 1, 'require' => true,   'desc' => '第三方标识'),
                    'nicename' => array('name' => 'nicename', 'type' => 'string',   'default'=>'',  'desc' => '第三方昵称'),
                    'avatar' => array('name' => 'avatar', 'type' => 'string',  'default'=>'', 'desc' => '第三方头像'),
                    'sign' => array('name' => 'sign', 'type' => 'string',  'default'=>'', 'desc' => '签名'),
                    'source' => array('name' => 'source', 'type' => 'string',  'default'=>'pc', 'desc' => '来源设备'),
                ),

     

    /**
         * 第三方登录
         * @desc 用于用户登陆信息
         * @return int code 操作码,0表示成功
         * @return array info 用户信息
         * @return string info[0].id 用户ID
         * @return string info[0].user_nicename 昵称
         * @return string info[0].avatar 头像
         * @return string info[0].avatar_thumb 头像缩略图
         * @return string info[0].sex 性别
         * @return string info[0].signature 签名
         * @return string info[0].coin 用户余额
         * @return string info[0].login_type 注册类型
         * @return string info[0].level 等级
         * @return string info[0].province 省份
         * @return string info[0].city 城市
         * @return string info[0].birthday 生日
         * @return string info[0].token 用户Token
         * @return string msg 提示信息
         */
        public function userLoginByThird() {
            $rs = array('code' => 0, 'msg' => '', 'info' => array());
            $openid=checkNull($this->openid);
            $type=checkNull($this->type);
            $nicename=checkNull($this->nicename);
            $avatar=checkNull($this->avatar);
            $source=checkNull($this->source);
            $sign=checkNull($this->sign);
            
            
            $checkdata=array(
                'openid'=>$openid
            );
            
            $issign=checkSign($checkdata,$sign);
            if(!$issign){
                $rs['code']=1001;
                $rs['msg']='签名错误';
                return $rs;    
            }
            
            
            
            $domain = new Domain_Login();
            $info = $domain->userLoginByThird($openid,$type,$nicename,$avatar,$source);
            
            if($info==1002){
                $rs['code'] = 1002;
                //禁用信息
                $baninfo=$domain->getThirdUserban($openid,$type);
                $rs['info'][0] =$baninfo;
                return $rs;                    
            }else if($info==1003){
                $rs['code'] = 1003;
                $rs['msg'] = '该账号已被禁用';
                return $rs;    
            }

            $rs['info'][0] = $info;
            

            return $rs;
        }

    ……后续的数据库操作根据自己的实际项目需求自行处理。

    展开全文
  • java结合微信小程序实现微信登录

    千次阅读 2018-05-13 20:56:42
    笔者最近刚开始玩微信小程序,对其中的一些原理还不是很清楚,欢迎各位批评指正。 在网络中传输明文会存在一定的风险,因此想要与后台数据库结合,笔者认为不能直接调用微信认证的接口,并且将用户信息传递到后台,...

    笔者最近刚开始玩微信小程序,对其中的一些原理还不是很清楚,欢迎各位批评指正。

        在网络中传输明文会存在一定的风险,因此想要与后台数据库结合,笔者认为不能直接调用微信认证的接口,并且将用户信息传递到后台,而应该先调用微信的方法获取加密的encrypedData、iv、code等,在后台将用户数据进行解析,并存入数据库。

        总体的思路时,当启动小程序的时候,从微信服务器请求到加密数据以及code等,并携带这些数据向服务器发请求(是自己的服务器,不是微信服务器),服务器先根据code获取用户的openid(一个唯一标识,如果不清楚可以参考笔者的另外一篇文章: java实现微信登录)从缓存中查询是否有此用户对应的信息(openid),如果有则直接从缓存中将数据返回,如果没有则调用微信授权的接口,获取用户信息存入数据库和缓存,并将用户信息返回给小程序。

    该项目后台为springboot+mybatisplus,下面是核心代码:

    一、小程序启动的js

    //app.js
    App({
      onLaunch: function () {
        // 展示本地存储能力
        var logs = wx.getStorageSync('logs') || []
        logs.unshift(Date.now())
        wx.setStorageSync('logs', logs)
      },
    
      denglu: function () {
        var that = this;
        // 登录
        wx.login({
          success: res => {
            // 发送 res.code 到后台换取 openId, sessionKey, unionId
            wx.getUserInfo({
              success: result => {
                // 获取用户信息
                wx.request({
                  url: '/user/start',
                  method: 'GET',
                  data: {
                    code: res.code,
                    encryptedData: result.encryptedData,
                    iv: result.iv
                  },
                  success: function (e) {
                    //console.log(e.data.data);
                    that.globalData.userInfo = e.data.data;
                    if (this.userInfoReadyCallback) {
                      this.userInfoReadyCallback(e.data.data);                
                      }
                  }
                })
              }
            })
          }
        })
      },
    
      globalData: {
        userInfo: null
      }
    })

    二、Controller层

        @GetMapping("/start")
        public BabyResult startApp(@RequestParam("encryptedData") String encrypted_data,
                                   @RequestParam("iv") String iv,
                                   @RequestParam("code") String code) {
    
            try {
                BabyResult result =  userService.startApp(encrypted_data, iv, code);
                return result;
            } catch (Exception e) {
                e.printStackTrace();
                return BabyResult.build(500, "启动错误");
            }
    
        }

    三、Service层

        @Override
        public BabyResult startApp(String encrypted_data, String iv, String code) {
    
            try {
                //获取session_key
                String accessJson = this.getSessionKey(code);
                if ("".equals(accessJson)) {
                    return BabyResult.build(401, "获取session_key失败");
                }
                JsonObject accessJsonObject = new JsonParser().parse(accessJson).getAsJsonObject();
                String openid = accessJsonObject.get("openid").getAsString();
    
                if(!userMap.containsKey(openid)) {
                    /**
                     * 第一次授权
                     */
                    //解析用户微信信息
                    String session_key = accessJsonObject.get("session_key").getAsString();;
                    String userWxInfoJson = WxDataUtil.DecryptDataGetUserInfoJson(encrypted_data, session_key, iv);
                    if (null == userWxInfoJson || "".equals(userWxInfoJson)) {
                        logger.debug("获取用户微信信息失败");
                        return BabyResult.build(401, "获取用户微信信息失败");
                    }
                    //保存用户信息
                    User user = this.saveUserInfo(userWxInfoJson, openid);
                    //将用户信息放入缓存
                    userMap.put(openid, user);
                    //将用户信息返回给客户端
                    return BabyResult.ok(user);
                } else {
                    /**
                     * 开启小程序,之前已经授权
                     */
                    User user = (User) userMap.get(openid);
                    return BabyResult.ok(user);
                }
            } catch (Exception e) {
                e.printStackTrace();
                logger.debug("拉取登录信息失败");
                return BabyResult.build(500, "拉取登录信息失败");
            }
    
        }

    四、解密微信数据

    public static String DecryptDataGetUserInfoJson(String encryptedData,String sessionkey,String iv){
            // 被加密的数据
            byte[] dataByte = Base64.decode(encryptedData);
            // 加密秘钥
            byte[] keyByte = Base64.decode(sessionkey);
            // 偏移量
            byte[] ivByte = Base64.decode(iv);
            try {
                // 如果密钥不足16位,那么就补足.  这个if 中的内容很重要
                int base = 16;
                if (keyByte.length % base != 0) {
                    int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
                    byte[] temp = new byte[groups * base];
                    Arrays.fill(temp, (byte) 0);
                    System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
                    keyByte = temp;
                }
                // 初始化
                Security.addProvider(new BouncyCastleProvider());
                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");
                SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
                AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
                parameters.init(new IvParameterSpec(ivByte));
                cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化
                byte[] resultByte = cipher.doFinal(dataByte);
                if (null != resultByte && resultByte.length > 0) {
                    String result = new String(resultByte, "UTF-8");
                    return result;
                }
            } catch (Exception e) {
                e.printStackTrace();
            } 
            return null;
        }

    五、总结

        微信程序现在比较火,但是微信开发工具还是有很多的bug。而且大部分都是用php做后台服务,笔者也用过,确实php开发比较简单,因为小程序毕竟不会像传统应用那样具有特别复杂的逻辑;笔者主要是做java开发,因此用java写了一套服务。其实,在这个webservice的时代,大家都遵循Restful风格的API,即使不同的编程语言,也都可以相互调用。

    展开全文
  • 这两天在自己的小项目中加入了微信小程序的很多功能,今天来说一下关于微信授权登录的部分。 需要的材料 1:一个可以测试的微信小程序 2:此微信小程序的APPID和APPscret 流程 微信用户对应一个小程序都有一个...
  • 需要的材料1:一个可以测试的微信小程序2:此微信小程序的APPID和APPscret流程微信用户对应一个小程序都有一个唯一的openid,微信授权登录微信授权登录的核心就是获取这个openid并存在数据库作为用户存在的唯一...
  • 地址:https://blog.csdn.net/yan245294305/article/details/84993265 很不错
  • 主要介绍了使用 UniApp 实现小程序微信登录功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
  • 微信小程序可以通过微信官方提供的登录能力,获取用户信息,建立用户体系。 本人做的登录测试需要用到以下3个东西: 1.小程序 小程序是用户使用的客户端,由于小程序运行在微信之上,所以小程序可以通过微信官方...
  • 个人小程序实现微信支付

    千次阅读 2020-01-20 17:53:37
    其实个人小程序是没办法直接调用微信支付的,但是可以间接的去调用,就是通过第三方的服务. 如:https://www.payjx.cn/ 通过调用它得接口,返回一个带支付二维码得结果,这个二维码被微信扫码支付后,通过开发者留得通知...
  • ... 使用条件 1、商户号(或同主体其他非服务商商户号)已入驻90日 2、商户号(或同主体其他非服务商商户号)有30天连续正常...3、登录微信支付商户平台-产品中心,开通企业付款。 付款资金 企业付款到零钱资...
  • jdk1.8+eclipse+tomact 8.5+maven3.5+springboot 2.0.1 微信开发者工具 数据库 一张表三个字段 CREATE TABLE `user` ( `uid` varchar(50) NOT NULL, `username` varchar(50) NOT NULL, `password` varchar(50) ...
  • 这篇文章将介绍 python + sanic + 微信小程序实现用户快速注册登录全栈方案。微信小程序登录时序图如下:这个流程分为两大部分:小程序使用 wx.login() API 获取 code,调用 wx.getUserInfo() API 获取 ...
  • 小程序实现微信支付java后端

    千次阅读 2017-07-10 00:36:38
    进入小程序,下单,请求下单支付,调用小程序登录API来获取Openid(https://mp.weixin.qq.com/debug/w ... .html#wxloginobject),生成商户订单,这些都是在小程序端完成的业务。  小程序端代码  // pages/...
  • 1.微信登录思路:在main.js 中封装公共函数,用于判断用户是否登录在main.js 中分定义全局变量,用于存储接口地址如果没有登录、则跳转至登录页面进入登录页面通过 wx.login 获取用户的 code通过 code 获取用户的 ...
  • SpringBoot实现微信小程序登录微信小程序登录流程登录流程图前端代码后端代码 微信小程序登录流程 微信小程序官方文档:微信小程序官方文档 第一次学习微信小程序登录,以前也好奇微信小程序的授权登录是怎么实现的...
  • 主要为大家详细介绍了PHP后台实现微信小程序登录,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,837
精华内容 734
关键字:

小程序实现微信登录