微信开发小程序流程java

2018-03-21 21:30:58 huige_666 阅读数 92344

        博主是大四学生,毕业设计做的是微信小程序+java后台。陆陆续续经历了三个月(因为白天要实习又碰上过年玩了一阵子),从对微信小程序一无所知到完成毕设,碰到许多问题,在跟大家分享一下自己的经历和一个小程序怎么从零开始。希望像我一样的小程序初学者看了这篇文章,可以少花费一些不必要的时间,少踩一点坑。

    

        开发一个微信小程序需要https域名以及服务器,博主购买的是阿里云的服务器。接下来详细讲解一下开发小程序需要什么东西。

        1. 进入微信公众平台https://mp.weixin.qq.com/注册微信小程序,并获得APPID和APPsecrete。

            首先你得注册你的小程序,填写小程序的内容,过程很简单,博主就不赘述了

    

        

2.下载微信开发者工具,在上面那个网站可以下载。

    微信开发者工具是专门写微信小程序前台页面的,有html/javaScript/css基础的朋友可以结合API直接实践了。具体开发内容我就不详细说明了。

 

     

  

     3.后台和服务器

        后台:因为博主在比较熟悉SSM框架,就使用了SSM框架的后台,开发工具Eclipse,有javaWeb开发经验的朋友这里就很容易了,至于大家使用SSH,还是直接使用servlet,或者其他后台,这就看个人所熟悉什么技术了。

        服务器:在阿里云买了个服务器(学生价9.9/月,腾讯云似乎更便宜),数据库使用的是mysql。 嫌安装麻烦的朋友在这里推荐OneinStack,一键帮你装好java+tomcat+mysql,好像就几块钱。

        如果是购买阿里云的服务器,注意一下:阿里云在外部还有一层保护,记得配置安全组规则,打开80,8080,3306,443,8443端口,博主被这里坑了很久,因为没有打开3306端口,一直连接不上服务器上的mysql。

        至于前台如何连接到后台,api中有,最简单的就是wx.request直接发起url请求(多看看别人小程序源码以及API)。

    

  4.https域名(挺麻烦,但是两到三天就能搞定)

    开发微信小程序需要SSL证书的域名,在这里推荐大家买个便宜的域名,博主购买的是top,在阿里云上买的,几块钱。

    接下来就是域名备案了,这个比较麻烦,但是是必须的,推荐阿里云备案系统,大概两三个工作日就搞定了,阿里云的工作人员态度都非常好。

    域名备案完成后,阿里云上有免费的SSL证书,申请成功后下载,并按照他们的提示进行配置,就大功告成啦!

    不要忘了域名解析要解析到自己的服务器上。

    还有最后一步,你必须登录微信公众平台,配置服务器域名,这样才允许在微信前台中使用该域名。


   5.接下来就可以安心搞开发了,博主在开发过程中看了大量其他小程序的源码和官方API,终于完成了这个毕业设计。
2019-07-31 15:01:17 zhyl8157121 阅读数 8692

背景

为其他公司开发一个小程序,这个小程序要只能在企业微信里面访问,不能通过普通微信访问。

企业微信里只有授权的用户可以使用该小程序。

之所以要整理这样一个流程,是因为微信那边的文档太分散了,乱七八糟的,我也是花了很长时间才把这个流程理顺。

问题分析

首先,这里面需要解决几个问题:

1、只在企业微信里使用,不能在普通小程序使用

判断当前运行环境

2、只有授权的用户可以使用该小程序

权限校验

1:普通微信,使用账号+密码登陆,审核专用,可限制账号权限

2:企业微信,校验企业id,校验用户id,有权限的才允许使用

3、控制搜索

在小程序管理后台设置「不允许被搜索」

4、控制分享

小程序里面关闭分享

OK,做到以上几点,就实现了只有企业微信里授权的用户,才能够在企业微信的 工作台 看到该小程序。

处理流程

好,既然问题已经明确了,那我们就搞起。

1、小程序基础功能开发,提交审核

对,没看错,先提交审核,因为只有审核通过的小程序才能被企业微信绑定。所以,先把小程序的基础功能做出来,可以限制一部分功能,总之,就是先让这个小程序上架。同时,在小程序的管理后台设置「不允许被搜索」,避免不必要的麻烦。

2、企业微信关联小程序

进入企业微信后台 -> 应用管理 -> 小程序 -> 关联小程序,然后使用小程序管理员的微信扫码,按照指引操作即可。

3、获取关联小程序的 Secret,设置可见范围

上一步的小程序页面会出现刚才关联的小程序,点击进入,然后就看到 secret 及可见范围。

这个 secret 相当于该小程序访问该企业微信数据的令牌,请妥善保存。

可见范围就是授权,哪些用户能看到这个小程序,被设置可见的人将会在自己企业微信的工作台看到该小程序。

4、修改小程序

好了,到重头戏了。

4.1、判断运行环境

小程序需要判断当前的运行环境(普通微信 or 企业微信),需要判断使用当前小程序的用户是否有权限使用。

var isWxWork = false;
wx.getSystemInfo({
  success(res) {
    console.log(res.environment);

    isWxWork = res.environment == 'wxwork';
    if (!isWxWork) {
        // 当前环境不是企业微信,怎么处理你随便
        return;
    }
    
    // 当前环境是企业微信,执行登陆,获取用户 code,用于后面的权限校验
    wx.qy.login({
      success: function (res) {
        if (res.code) {
            console.log(res.code);
            
            // 这里可以将 res.code 通过请求发送给后台,让后台做权限校验
        } else {
            console.log('登录失败!' + res.errMsg);
        }
      }
    });
  }
})

4.2、权限校验

后台需要调用以下几个接口来进行权限校验。

1、获取 access_token

https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=xxxx&corpsecret=xxxx

请求方式:GET

这个接口和普通微信获取 token 的方法类似。

其中,corpid 在企业微信管理后台->我的企业->企业信息->企业ID;corpsecret 就是我们上一步关联小程序后获取的 secret。

返回内容如下:

{
    "errcode": 0,
    "errmsg": "ok",
    "access_token": "xxxxxx",
    "expires_in": 7200
}

2、获取 userid

https://qyapi.weixin.qq.com/cgi-bin/miniprogram/jscode2session?access_token=xxx&js_code=xxx&grant_type=authorization_code

请求方式:GET

其中,access_token 是我们前一步 gettoken 获取到的;js_code 是前面判断运行环境时获取到的 res.codegrant_type 固定传 authorization_code

返回内容如下:

{
    "userid": "bottle",
    "session_key": "xxxxx",
    "corpid": "xxxxxx",
    "deviceid": "xxxxxx",
    "errcode": 0,
    "errmsg": "ok"
}

这里的 corpid 可以用来初步校验当前用户是否有权限,因为无论哪个公司的人,只要他用企业微信,使用这个小程序,都会返回这样的结果,你需要根据 corpid 是否是你授权的企业的ID来校验,如果不是,直接返回无权限就可以,不用进行下一步。

当然 corpid 也可以用于处理一个小程序关联多家公司的情况,不过这是另一个问题了。这里简单提一嘴,因为是给其他公司开发的小程序,所以我们这个小程序也关联了两个企业,一个我们公司,一个对方公司,这样也方便我们测试,只需要给我们自己的测试人员授权就可以让他们使用完全相同的环境进行测试了。

3、获取用户信息(判断权限)

https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=xxx&userid=xxx

请求方式:GET

其中,access_token 是我们前一步 gettoken 获取到的;userid 就是我们上一步获取到的 userid

返回内容如下:

  • 有权限
{
    "errcode": 0,
    "errmsg": "ok",
    "userid": "xxx",
    "name": "xxx",
    "department": [],
    "position": "",
    "mobile": "xxx",
    "gender": "2",
    "email": "",
    "avatar": "http://p.qlogo.cn/bizmail/xxx/0",
    "status": 1,
    "isleader": 0,
    "extattr": {
        "attrs": []
    },
    "telephone": "",
    "enable": 1,
    "hide_mobile": 0,
    "order": [],
    "qr_code": "https://open.work.weixin.qq.com/wwopen/userQRCode?vcode=xxx",
    "alias": "",
    "is_leader_in_dept": []
}
  • 无权限
{
    "errcode": 60011,
    "errmsg": "no privilege to access/modify contact/party/agent , hint: [1564556097_7_8d45297bd21be3702ff430560e1f0652], from ip: 118.113.1.217, more info at https://open.work.weixin.qq.com/devtool/query?e=60011",
    "department": [],
    "order": [],
    "is_leader_in_dept": []
}

OK,后面根据有权限还是无权限,执行不同的操作就可以了,这里不再赘述。

参考资料

企业微信API(小程序):https://work.weixin.qq.com/api/doc#90000/90136/90289

企业微信接口调试工具:https://work.weixin.qq.com/api/devtools/devtool.php

错误码查询工具:https://open.work.weixin.qq.com/devtool/query

2019-02-18 12:59:54 qq_41066066 阅读数 34266

微信小程序+Java后台开发

全部代码链接

链接:https://pan.baidu.com/s/1viujpT2EcgA8zFasHicflA
提取码:wcvd

若失效,关注我的公众号回复关键字【666】点击领取
迈莫公众号

  • 通过这个博客,你可以快速的搭建一个微信小程序前端和后台相连的一个功能,在这里我会详细的解说每一个步骤,就是如何实现小程序的前后台相互关联;因为是实现简易的小程序的某个功能,主要是为了了解小程序前台如何和后台相连,所以在此博客中使用的是本地tomcat服务器。*

使用的工具:

idea
springmvc
微信小程序开发工具
tomcat
微信小程序API
所使用的jar包
我已经上传到百度云盘里了,如果有需要可以去下载
链接:https://pan.baidu.com/s/1KSqQLs9JMWB2SqgVVEwhKw
提取码:9s0s
在这里插入图片描述
1.JAV后端详解

我写后台主要使用的是Java,框架是SSM,由于自己的知识浅薄,只能使用自己已有的知识进行开发学习,因为微信小程序前台和后台数据传输是以Json数据格式传送的,所以建议如果了解过springBoot的话,用它更加方便快捷。

在这里我给大家说一个json数据格式究竟是什么,希望对大家有点帮助!!!

  1. json数据格式
    2.1 jso有两种格式:一个是json对象,另一种是json数组
    2.1.1 json对象:可以理解为Java中对象,是以键值对形式存在的
    例子: {“key”:value, “key1”:value1}
    2.1.2 json数组:
    例子:[{“key”:value,“key”:value}]

首先在idea中创建一个JavaEE项目,具体如何创建,在这里我就不祥解了,如果有不会的,可以去网上搜一艘,在这里我会直接打开我先前创建下个JavaEE项目。

  1. 首先在微信小程序开发工具中新建一个项目,然后再自己所写的某一个页面中,其次在自己页面的wxml文件中编写内容
    web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!--前端控制器-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!--字符编码-->
    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>
  1. 其次在src/springmvc.xml编写springMVC的配置文件
    springMVC.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
         http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd"
       default-autowire="byName">

    <!--注解扫描-->
    <context:component-scan base-package="com.zb.lq.controller"/>
    <!--注解驱动-->
    <mvc:annotation-driven></mvc:annotation-driven>
</beans>
  1. 然后在控制器中编写代码
    我的实在DemoController中编写的
    在这里插入图迭代的片描述
    DemoController.java
@Controller
public class DemoController {
    @RequestMapping("getUser")
    @ResponseBody
    public List<String> getUser(){
        List<String> list = new ArrayList<>();
        list.add("中北大学");
        list.add("653");
        list.add("实验室");
        return list;
    }
}

至此,使用Java编写的后台已经基本完成,接下来启动tomcat,测试看是否编写成功
如果出现一下内容,则说明后台编写成功,要以json格式输出,因为小程序前台和后台相连是以json格式输出的

在这里插入图片描述

  1. 我以简单的按钮实现前后台交互:
    index.wxml
<button bindtap='houduanRequest'>获取信息</button>
<view wx:for="{{list}}" wx:fot-item="item">
  姓名:{{item}}
</view>

index.js

//index.js
const app = getApp()

Page({
  data: {
    list:''
  },
  houduanRequest:function(){
    var that = this;
    wx.request({
      url: 'http://localhost:8888/xiaochengxu/getUser',//自己请求的服务器的地址
      method: 'GET',
      header: {
        'content-type': 'application/json' // 默认值
      },
      success: function (req) {
        var list = req.data;
        if (list == null) {
          wx.showToast({
            title: 'ErrorMessage',
            icon: 'false',   //图标
            duration: 1500  //提示的延迟的时间
          })
        } else {
          that.setData({
            list: list
          })
        }
      }
    })
  },

  onLoad: function() {
    
  }, 

})

到此基本的功能代码已经完成了,现在我们开始启动tomcat,进行运行,看看结果究竟是什么…

在这里插入图片描述

在这里插入图片描述到此,实现小程序前后台相连已经实现了
希望对大家有点帮助!!!

公众号

希望大家多多关注,里面不定期发放干货
领取全套资料:回复关键字【666】
迈莫公众号

2017-06-05 08:54:51 zhongyouda 阅读数 28987

前段时间,我接触了微信的开发小程序,在开发过程中,我不得不承认微信小程序开发的简单粗暴,不多说,直接hight

微信小程序可以去公众平台下载。有64位和32位的。在这里我就不多哔哔了。

下载完微信小程序后,打开界面是这样子的,通过扫描二维码登录验证,添加项目,奉天承运,上图:


登陆完成后。。。


那个微信基础框架在公众平台会有简易教程,我就不多说了。

在这里我就直接讲我是如何链接后台进行开发的,其实和ajax一模一样的处理方式。


还有微信的单击事件,我是真的觉得简单粗暴。。。



只是简单的演示,我提示一下,这里的console调试用完之后,最好屏蔽掉,不然如果你console.log()报错了,那么你后面的代码都会不执行,和js一样。也可以说其实就是js。


然后他的请求后台就是通过一个url来链接服务器,识别方法并运行。


这样子基本上就能链接服务器方法,进行调试了。。。

微信小程序相比较于app的话,本人觉得就是开发会更简单一点,而app开发的话不仅成本高,而且开发就会相对繁琐一点。再说兼容性的话小程序基本能装微信就能用了






2018-05-10 15:05:04 abcwanglinyong 阅读数 26087

一、登录流程图

二、微信小程序端

doLogin:function(callback = () =>{}){
let that = this;
wx.login({
  success:function(loginRes){
    if(loginRes){
      //获取用户信息
      wx.getUserInfo({
        withCredentials:true,//非必填  默认为true
        success:function(infoRes){
          console.log(infoRes,'>>>');
          //请求服务端的登录接口
          wx.request({
            url: api.loginUrl,
            data:{
              code:loginRes.code,//临时登录凭证
              rawData:infoRes.rawData,//用户非敏感信息
              signature:infoRes.signature,//签名
              encrypteData:infoRes.encryptedData,//用户敏感信息
              iv:infoRes.iv//解密算法的向量
            },
            success:function(res){
              console.log('login success');
              res = res.data;
              if(res.result==0){
                that.globalData.userInfo = res.userInfo;
                wx.setStorageSync('userInfo',JSON.stringify(res.userInfo));
                wx.setStorageSync('loginFlag',res.skey);
                console.log("skey="+res.skey);
                callback();
              }else{
                that.showInfo('res.errmsg');
              }
            },
            fail:function(error){
              //调用服务端登录接口失败
             // that.showInfo('调用接口失败');
              console.log(error);
            }
          });
        }
      });
    }else{

    }
  }
});
}

微信小程序端发起登录请求,携带的参数主要有:

    code:loginRes.code,//临时登录凭证
    rawData:infoRes.rawData,//用户非敏感信息
    signature:infoRes.signature,//签名
    encrypteData:infoRes.encryptedData,//用户敏感信息
    iv:infoRes.iv//解密算法的向量

需要的数据主要有:

result、userInfo和skey

result用来判断是否登录成功,userInfo是用户的一些信息,保存在缓存中,不用每次都从后台获取,skey是用户登录态标识,也放在缓存中,如果skey存在就直接登录,维护用户的登录状态,具有时效性

三、Java后台

@ResponseBody
@RequestMapping("/login")
public Map<String,Object> doLogin(Model model,
                                  @RequestParam(value = "code",required = false) String code,
                                  @RequestParam(value = "rawData",required = false) String rawData,
                                  @RequestParam(value = "signature",required = false) String signature,
                                  @RequestParam(value = "encrypteData",required = false) String encrypteData,
                                  @RequestParam(value = "iv",required = false) String iv){
    log.info( "Start get SessionKey" );


    Map<String,Object> map = new HashMap<String, Object>(  );
    System.out.println("用户非敏感信息"+rawData);

    JSONObject rawDataJson = JSON.parseObject( rawData );

    System.out.println("签名"+signature);
    JSONObject SessionKeyOpenId = getSessionKeyOrOpenId( code );
    System.out.println("post请求获取的SessionAndopenId="+SessionKeyOpenId);

    String openid = SessionKeyOpenId.getString("openid" );

    String sessionKey = SessionKeyOpenId.getString( "session_key" );

    System.out.println("openid="+openid+",session_key="+sessionKey);

    User user = userService.findByOpenid( openid );
    //uuid生成唯一key
    String skey = UUID.randomUUID().toString();
    if(user==null){
        //入库
        String nickName = rawDataJson.getString( "nickName" );
        String avatarUrl = rawDataJson.getString( "avatarUrl" );
        String gender  = rawDataJson.getString( "gender" );
        String city = rawDataJson.getString( "city" );
        String country = rawDataJson.getString( "country" );
        String province = rawDataJson.getString( "province" );


        user = new User();
        user.setUid( openid );
        user.setCreateTime( new Date(  ) );
        user.setSessionkey( sessionKey );
        user.setUbalance( 0 );
        user.setSkey( skey );
        user.setUaddress( country+" "+province+" "+city );
        user.setUavatar( avatarUrl );
        user.setUgender( Integer.parseInt( gender ) );
        user.setUname( nickName );
        user.setUpdateTime( new Date(  ) );

        userService.insert( user );
    }else {
        //已存在
        log.info( "用户openid已存在,不需要插入" );
    }
    //根据openid查询skey是否存在
    String skey_redis = (String) redisTemplate.opsForValue().get( openid );
    if(StringUtils.isNotBlank( skey_redis )){
        //存在 删除 skey 重新生成skey 将skey返回
        redisTemplate.delete( skey_redis );

    }
        //  缓存一份新的
        JSONObject sessionObj = new JSONObject(  );
        sessionObj.put( "openId",openid );
        sessionObj.put( "sessionKey",sessionKey );
        redisTemplate.opsForValue().set( skey,sessionObj.toJSONString() );
        redisTemplate.opsForValue().set( openid,skey );

        //把新的sessionKey和oppenid返回给小程序
        map.put( "skey",skey );



    map.put( "result","0" );



    JSONObject userInfo = getUserInfo( encrypteData, sessionKey, iv );
    System.out.println("根据解密算法获取的userInfo="+userInfo);
    userInfo.put( "balance",user.getUbalance() );
    map.put( "userInfo",userInfo );

    return map;
}

获取openid和sessionKey方法

public static JSONObject getSessionKeyOrOpenId(String code){
    //微信端登录code
    String wxCode = code;
    String requestUrl = "https://api.weixin.qq.com/sns/jscode2session";
    Map<String,String> requestUrlParam = new HashMap<String, String>(  );
    requestUrlParam.put( "appid","你的小程序appId" );//小程序appId
    requestUrlParam.put( "secret","你的小程序appSecret" );
    requestUrlParam.put( "js_code",wxCode );//小程序端返回的code
    requestUrlParam.put( "grant_type","authorization_code" );//默认参数

    //发送post请求读取调用微信接口获取openid用户唯一标识
    JSONObject jsonObject = JSON.parseObject( UrlUtil.sendPost( requestUrl,requestUrlParam ));
    return jsonObject;
}

解密用户敏感数据获取用户信息

public static JSONObject getUserInfo(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 JSON.parseObject(result);
        }
    } catch (NoSuchAlgorithmException e) {
        log.error(e.getMessage(), e);
    } catch (NoSuchPaddingException e) {
        log.error(e.getMessage(), e);
    } catch (InvalidParameterSpecException e) {
        log.error(e.getMessage(), e);
    } catch (IllegalBlockSizeException e) {
        log.error(e.getMessage(), e);
    } catch (BadPaddingException e) {
        log.error(e.getMessage(), e);
    } catch (UnsupportedEncodingException e) {
        log.error(e.getMessage(), e);
    } catch (InvalidKeyException e) {
        log.error(e.getMessage(), e);
    } catch (InvalidAlgorithmParameterException e) {
        log.error(e.getMessage(), e);
    } catch (NoSuchProviderException e) {
        log.error(e.getMessage(), e);
    }
    return null;
}

四、流程

1.小程序端发起请求并携带主要参数

2.java后台接到/login请求后,根据code去调用微信接口获取用户唯一标识openid和sessionKey

3.根据openid查询mysql数据库,判断该用户是否存在,如果不存在将用户非敏感信息和其他初始化数据存入到数据库中,如果已存在,不操作

4.根据openid查询redis数据库,判断openid对应的skey是否存在,如果存在则删除原来老的skey以及对应的openid和sessionKey

5.通过uuid生成唯一的skey,用openid做键,skey做值,存入到redis中

6.然后把skey做键,openid和sessionKey的json串做值也重新存入到redis中

7.根据解密算法,参数有encryptedData、sessionKey和iv,获取用户信息userInfo,如果userInfo字段不满足需要,可通过userInfo.put( "balance",user.getUbalance() );添加所需要的字段和值

8.将微信小程序需要的数据封装到map中,返回给小程序端

map.put( "skey",skey );

map.put( "result","0" );

map.put( "userInfo",userInfo ); 

return map;

更多博客内容详见我的博客 Wang's Blog