精华内容
下载资源
问答
  • java开发微信小程序支付接口 刚开始写微信小程序支付接口,一脸的懵逼 接口是什么?怎么写? 找了许多文档,都没有一个完整的解释,接口其实就是前端调用后台的一个请求(url),只要让前端把我们需要的参数绑定上去...

    java开发微信小程序支付接口

    刚开始写微信小程序支付接口,一脸的懵逼

    接口是什么?怎么写?

    找了许多文档,都没有一个完整的解释,接口其实就是前端调用后台的一个请求(url),只要让前端把我们需要的参数绑定上去传递过来就行!!!(原来这就是所谓的写接口!)

    理解了如何是接口,然后就开始写微信小程序的支付接口,搜了好多的文档,API 官方文档Api:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=1_1

    最后找到一个大佬写的 见:https://blog.csdn.net/qq_36571139/article/details/77983745

    刚开始即使全部复制,照着写一模一样也不能运行,一直出现签名失败,找了许多答案

    也使用https://pay.weixin.qq.com/wiki/tools/signverify/微信官方提供的签名生成对应了一下 没毛病啊。

    最后发现是Api密钥写成AppSecret了(想死的心都有了。。)
    api密钥:微信商户平台(pay.weixin.qq.com)–>账户设置–>API安全–>密钥设置。

    改完了就一直提示openid is invalid出错,搜的许多都是说,让用户关注一下什么的,但是我的openid是自己写的,你能相信么!!! 刚写这个谁知道openid是前端传过来的一个参数!!!我们只需要用这个参数就行了

    然后运行OK!(终于搞定了。。。)

    展开全文
  • Springboot+Mybatis+Mysql+ 微信小程序+Mpvue 1、小程序展示 2、功能介绍 用户第一次使用小程序 用户授权 上传视频和图片 设置密码和有效期 分享给微信好友 输入密码提取资料 下载资料 个人...

    目录

     

    使用的技术

    2、功能介绍 

    3、此小程序未部署 所以体验不了

    4、如何联系我或需要源码进行联系


    使用的技术

    Springboot+Mybatis+Mysql+ 微信小程序+Mpvue

     

    1、小程序展示

     后台管理

     

     

     

     

     

    2、功能介绍 

    1. 用户第一次使用小程序 用户授权
    2. 上传视频和图片
    3. 设置密码和有效期
    4. 分享给微信好友
    5. 输入密码提取资料
    6. 下载资料
    7. 个人中心
    8. 用户反馈 发送邮件

    3、此小程序未部署 所以体验不了

    4、如何联系我或需要源码进行联系

    展开全文
  • JAVA开发微信小程序订阅消息服务端

    千次阅读 2019-12-30 19:58:50
    微信小程序开发(非云服务) 开发背景 由于项目需要实现手机端推送消息的的功能,ios和安卓的开发学习成本太高了(尤其是安卓每年一个大版本,想想就脑瓜子疼),所以就想到了最近比较火的微信小程序,看了小程序...

    微信小程序的开发(非云服务)

    开发背景

    由于项目需要实现手机端推送消息的的功能,ios和安卓的开发学习成本太高了(尤其是安卓每年一个大版本,想想就脑瓜子疼),所以就想到了最近比较火的微信小程序,看了小程序的开发文档有订阅消息的功能,并且小程序免安装,跨平台,学习成本低(emmmmmmmmm),马上开干!!!

    前期准备

    • 有公网IP的服务器(我用的是腾讯云)
    • ICP备过案的域名
    • SSL证书(为了安全性,小程序的请求只支持https)
    • 在微信公众平台注册一个小程序账号( https://mp.weixin.qq.com/ )

    开发过程

    第一步:环境的搭建

    • 我是用Java开发的后台服务,所以我安装了JDK1.8和Tomcat8

      启动一下tomcat,用自己的域名加8080端口看看能不能访问,如果能就表示域名可以解析到了!

    • 考虑到后期会有登陆模块,所以还需要有redis做个缓存,存一下用户的session

    第二步:下载并安装微信开发者工具

    下载地址: https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html
    在这里插入图片描述

    第三步:新建一个小程序工程

    新建的时候会要求填写AppID,这个可以在微信公众平台的设置(设置—基本设置—账号信息)里找到
    找到AppID新建一个小程序的工程
    在这里插入图片描述

    如果需要数据存储或者文件服务等可以选择云开发,因为我只是需要消息推送的功能,所以我我选择不使用云服务

    在这里插入图片描述
    看这个项目结构是不是跟vue很像,做过vue的同学应该上手很快,没做过的也没事,直接看微信公众平台的开发者文档 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/launchApp.html ,写的很详细!

    第四步:小程序配置

    小程序根目录下的 app.json文件用来对微信小程序进行全局配置。文件内容为一个 JSON 对象 ,可以参照开发者文档里的配置项根据自己的需求进行配置,其中最重要的就是pages是路由的配置
    在这里插入图片描述

    第五步:开发小程序页面

    小程序有自己的dom节点,如果直接用html的dom节点,会识别不了,所以还是要查看开发者文档的组件,找到自己所需的节点。具体的数据流语法可以参照vue,常用的模板取值方式是{{}}。

    在这里插入图片描述

    小程序相关代码

    app.js:

    //app.js
    App({
      globalData: {
        openid: "",
        userInfo: null,
      },
      onLaunch: function () {
        var that = this
        // 展示本地存储能力
        var logs = wx.getStorageSync('logs') || []
        logs.unshift(Date.now())
        wx.setStorageSync('logs', logs)
    
        // 登录
        wx.login({
          success: res => {
            var d = that.globalData
            var l = 'https://www.songguopeng.com/getOpenId'
            wx.request({
              url: l,
              data: {
                code: res.code
              },
              method: 'GET',  
              success: function (res) {
                console.log(res.data)
                that.globalData.openid = res.data
              }
            })    
          }
        })
        // 获取用户信息
        wx.getSetting({
          success: res => {
            if (res.authSetting['scope.userInfo']) {
              // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
              wx.getUserInfo({
                success: res => {
                  // 可以将 res 发送给后台解码出 unionId
                  this.globalData.userInfo = res.userInfo
    
                  // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
                  // 所以此处加入 callback 以防止这种情况
                  if (this.userInfoReadyCallback) {
                    this.userInfoReadyCallback(res)
                  }
                }
              })
            }
          }
        })
      }
    })
    

    index.js

    //index.js
    //获取应用实例
    const app = getApp()
    
    Page({
      data: {
        motto: '欢迎使用perceive消息推送平台',
        userInfo: {},
        hasUserInfo: false,
        canIUse: wx.canIUse('button.open-type.getUserInfo')
      },
      //事件处理函数
      bindViewTap: function() {
        wx.navigateTo({
          url: '../logs/logs'
        })
      },
      onLoad: function () {
        if (app.globalData.userInfo) {
          this.setData({
            userInfo: app.globalData.userInfo,
            hasUserInfo: true
          })
        } else if (this.data.canIUse){
          // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
          // 所以此处加入 callback 以防止这种情况
          app.userInfoReadyCallback = res => {
            this.setData({
              userInfo: res.userInfo,
              hasUserInfo: true
            })
          }
        } else {
          // 在没有 open-type=getUserInfo 版本的兼容处理
          wx.getUserInfo({
            success: res => {
              app.globalData.userInfo = res.userInfo
              this.setData({
                userInfo: res.userInfo,
                hasUserInfo: true
              })
            }
          })
        }
      },
      getUserInfo: function(e) {
        console.log(e)
        app.globalData.userInfo = e.detail.userInfo
        this.setData({
          userInfo: e.detail.userInfo,
          hasUserInfo: true
        })
      },
      bindService: function() {
        wx.requestSubscribeMessage({
          tmplIds: ['T6pW1mrK0V3voAL7JcMS-jboWAIxs8eCxMnYDJOj9u8'],
          success(res) { 
            console.log("授权成功")
            wx.request({
              url: 'http://songguopeng.viphk.ngrok.org/push',
              method: 'get',
              data: {
                openid: app.globalData.openid
              },
              success(res) {
              }
            })
          },
          fail(res){
            console.log("授权失败")
          }
        })
      }
    })
    
    

    index.wxml

    <!--index.wxml-->
    <view class="container">
      <view class="userinfo">
        <button wx:if="{{!hasUserInfo && canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 获取头像昵称 </button>
        <block wx:else>
          <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
          <text class="userinfo-nickname">{{userInfo.nickName}}</text>
        </block>
      </view>
      <view class="usermotto">
       <button class="button" form-type='submit' type='primary' bindtap='bindService'>
        <text>绑定perceive消息推送</text>
       </button>
      </view>
      <view class="usermotto">
        <text class="user-motto">{{motto}}</text>
      </view>
    </view>
    
    

    第六步:开发服务器

    由于需要进行订阅消息的推送,我们需要开发自己的服务平台进行消息的推送,微信提供了相关接口,我们只需要遵循他的请求形式去请求就可以,话不多说,直接上代码:

    • 首先先获取openid,openid获取到了我们就相当于获取到了这个微信小程序中该用户的唯一标识id,一切的操作都依赖于这个openid
    @RestController
    public class OpenIdController {
        public static final String URL_ACCESS_TOKEN = "https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=CODE&grant_type=authorization_code";
        @GetMapping(value = "getOpenId")
        public String getOpenId(@RequestParam(value = "code")String code){
            String url = URL_ACCESS_TOKEN.replace("APPID", WeChatConfig.APP_ID).replace("SECRET", WeChatConfig.SECRET_ID).replace("CODE", code);
            JSONObject jsonObject = UrlUtil.httpsRequest(url,"GET",null);
            String openid = jsonObject.getString("openid");
            return openid;
        }
    }
    
    • 然后拿到openid我们就可以遵循微信小程序的接口去给这个用户发送订阅消息了(需要用户授权才能发送,授权的过程在小程序代码,授权一次就有一次的发送机会,机会可以叠加,暂时不支持永久授权)
    @RestController
    public class PushController {
    
        @GetMapping("/push")
        public static String push(@RequestParam("openid")String openid) {
            String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
                    + WeChatConfig.APP_ID
                    + "&secret="
                    + WeChatConfig.SECRET_ID;
            String result = HttpUtil.sendGet(url);
            JSONObject object = JSON.parseObject(result);
            String Access_Token = object.getString("access_token");
            Template template = new Template();
            template.setTemplate_id(WeChatConfig.TEMPLATE_ID);
            template.setTouser(openid);
            template.setPage("pages/index/index");
            List<TemplateParam> paras = new ArrayList<>();
            paras.add(new TemplateParam("time1", "2019-12-28 10:00:00"));
            paras.add(new TemplateParam("thing2", "监控1发现2人"));
            template.setTemplateParamList(paras);
            String requestUrl = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN";
            requestUrl = requestUrl.replace("ACCESS_TOKEN", Access_Token);
    
            System.out.println(template.toJSON());
            net.sf.json.JSONObject jsonResult = UrlUtil.httpsRequest(requestUrl, "POST", template.toJSON());
            if (jsonResult != null) {
                System.out.println(jsonResult);
                int errorCode = jsonResult.getInt("errcode");
                String errorMessage = jsonResult.getString("errmsg");
                if (errorCode == 0) {
                    System.out.println("Send Success");
                } else {
                    System.out.println("订阅消息发送失败:" + errorCode + "," + errorMessage);
                }
            }
            return null;
        }
    }
    
    • 模板消息就不要用了,2020年1月10日就没有模板消息这个功能了,所以用订阅消息去给用户发消息
    效果图

    在这里插入图片描述

    如果有绑定微信服务器的需要可以用这段代码(一般公众号需要绑定服务端)

    在这里插入图片描述

    /**
     * 微信小程序的后台服务绑定
     */
    @RestController
    public class WeChatBindController {
        public static final String TOKEN = "beiyang";
        /**
         * 微信授权验证
         *
         * @param signature
         * @param timestamp
         * @param nonce
         * @param echostr
         * @return
         * @author songgp
         */
        @GetMapping(value = "/authWeChat")
        public String authWeChat(@RequestParam("signature") String signature, @RequestParam("timestamp") String timestamp,
                                 @RequestParam("nonce") String nonce, @RequestParam("echostr") String echostr) {
            //排序
            String[] arr = {TOKEN, timestamp, nonce};
            Arrays.sort(arr);
    
            StringBuilder content = new StringBuilder();
            for (int i = 0; i < arr.length; i++) {
                content.append(arr[i]);
            }
    
            //sha1Hex 加密
            MessageDigest md = null;
            String temp = null;
            try {
                md = MessageDigest.getInstance("SHA-1");
                byte[] digest = md.digest(content.toString().getBytes());
                temp = byteToStr(digest);
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
            if ((temp.toLowerCase()).equals(signature)) {
                return echostr;
            }
            return null;
    
        }
    
        private static String byteToStr(byte[] byteArray) {
            String strDigest = "";
            for (int i = 0; i < byteArray.length; i++) {
                strDigest += byteToHexStr(byteArray[i]);
            }
            return strDigest;
        }
    
        private static String byteToHexStr(byte mByte) {
            char[] Digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
            char[] tempArr = new char[2];
            tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
            tempArr[1] = Digit[mByte & 0X0F];
            String s = new String(tempArr);
            return s;
        }
    }
    
    
    展开全文
  • Java开发微信小程序登录接口

    千次阅读 2018-11-23 11:36:56
    先说一下需求吧,小程序微信登录,用户授权获取个人信息。然后保存用户基本信息到系统用户表,同时新增用户账户信息,上传用户头像。 emmm..之所以想写下来是因为自己踩过的坑啊。。就不细说了。 链接: 小程序...

    先说一下需求吧,小程序微信登录,用户授权获取个人信息。然后保存用户基本信息到系统用户表,同时新增用户账户信息,上传用户头像。

    emmm..之所以想写下来是因为自己踩过的坑啊。。就不细说了。


    链接: 小程序微信登录官方文档

     

    登录:

    之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。

    用户授权获取个人信息:

    wx.getUserInfo(OBJECT)

    注意:此接口有调整,使用该接口将不再出现授权弹窗,请使用 <button open-type="getUserInfo"></button> 引导用户主动进行授权操作

    注:当 withCredentials 为 true 时,要求此前有调用过 wx.login 且登录态尚未过期,此时返回的数据会包含 encryptedData, iv 等敏感信息;当 withCredentials 为 false 时,不要求有登录态,返回的数据不包含 encryptedData, iv 等敏感信息。

     

    这是官方给的文档写的。就是前端调用微信接口得到一个code和useInfo,把这两个给后台,后台首先通过code走微信提供的链接获取到用户唯一标识openid 和 会话密钥session_key。

    1

    2

    3

    String token = HttpUtil.doPost("n 

    ?appid=" + prop.get(APP_ID)+ "&secret=" + prop.get(API_KEY) +

     "&js_code=" code "&grant_type=authorization_code", null, "UTF-8");

    效验成功返回一个

    //正常返回的JSON数据包{  	"openid": "OPENID",  	"session_key": "SESSIONKEY"}

    效验失败返回

    1

    2

    //错误时返回JSON数据包(示例为Code无效){  "errcode"40029,  "errmsg": "invalid

     code"}

    效验成功后,然后是根据参数useInfo获取用户的信息。利用上面得到的openId和sessionkey

    小程序可以通过各种前端接口获取微信提供的开放数据。 考虑到开发者服务器也需要获取这些开放数据,微信会对这些数据做签名和加密处理。 开发者后台拿到开放数据后可以对数据进行校验签名和解密,来保证数据不被篡改。

    为了确保 开放接口 返回用户数据的安全性,微信会对明文数据进行签名。开发者可以根据业务需要对数据包进行签名校验,确保数据的完整性。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    JSONObject userInfo = JSONObject.parseObject(userInfo);

            // 用户信息

            // 签名校验

            if (!new String(SecureUtil.sha1X16(userInfo.get(WX_RAWDATA) 

            + sessionKey, ENCODING_FORMAT), ENCODING_FORMAT)

                .equals(userInfo.getString(WX_SIGNATURE))) {

                renderJson(Result.fail("签名校验失败").build());

                return;

            }

    签名效验成功后,解密加密的数据

    1

    2

    3

    4

    5

    6

    7

    8

    // 加密数据解密

            JSONObject userInfoEncrypted =

                desEncrypt(userInfo.getString(WX_ENCRYPTEDDATA), sessionKey,

                 userInfo.getString(WX_IV));

            if (null == userInfoEncrypted) {

                renderJson(Result.fail("数字水印校验失败").build());

                return;

            }

    解密完后就是根据自己的需求开发了。

    先判断第三方的openid在数据库中是否存在,如果存在则说明用户已经登录过小程序,如果数据库中不存在则用户是首次登录小程序需要将用户信息保存到数据库

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

     // 判断是否已注册

            String openId = userInfoEncrypted.getString(WX_USERINFO_OPEN_ID);

            MemberUser user = memberUserService.find(new MemberUser().setOpenId(openId));

            //已注册

            if (Tools.isNotEmpty(user)) {

                MemberInfo info = memberInfoService.find(new MemberInfo()

                .setUserId(user.getUserId()));

                result = assembleResult(user, info, userInfoEncrypted

                .getString(WX_USERINFO_NICKNAME), sessionKey);

                renderJson(Result.ok().put(result).build());

                return;

            }

    如果未注册过,就进行注册绑定,把openId保存到第三方绑定表,然后主键为用户表的外键。同时新增用户账户数据。把头像上传到自己服务器。

    设置微信手机号绑定一样的。

     

    注意:

    1、加密解密需要注意,userinfo和绑定手机号需要的phoneinfo都需要效验签名解密获得。效验解密方法官方文档也给出了例子。

    2、返回给前端的openId需要加密处理,防止被篡改。

    3、注意微信昵称的

    完整代码贴到下面,前端代码我就不说了,登录接口需要前端给两个参数:

    1、code (登录凭证)

    code String 用户登录凭证(有效期五分钟)。开发者需要在开发者服务器后台调用 api,使用 code 换取 openid 和 session_key 等信息

    2、 userInfo(用户信息)

    rawData String 不包括敏感信息的原始数据字符串,用于计算签名。
    signature String 使用 sha1( rawData + sessionkey ) 得到字符串,用于校验用户信息,参考文档 signature
    encryptedData String 包括敏感数据在内的完整用户信息的加密数据,详细见加密数据解密算法
    iv String 加密算法的初始向量,详细见加密数据解密算法

    UserInfo参数:

    nickName String 用户昵称
    avatarUrl String 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表132*132正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。
    gender String 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
    city String 用户所在城市
    province String 用户所在省份
    country String 用户所在国家
    language String 用户的语言,简体中文为zh_CN

     

    完整代码:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    73

    74

    75

    76

    77

    78

    79

    80

    81

    82

    83

    84

    85

    86

    87

    88

    89

    90

    91

    92

    93

    94

    95

    96

    97

    98

    99

    100

    101

    102

    103

    104

    105

    106

    107

    108

    109

    110

    111

    112

    113

    114

    115

    116

    117

    118

    119

    120

    121

    122

    123

    124

    125

    126

    127

    128

    129

    130

    131

    132

    133

    134

    135

    136

    137

    138

    139

    140

    141

    142

    143

    144

    145

    146

    147

    148

    149

    150

    151

    152

    153

    154

    155

    156

    157

    158

    159

    160

    161

    162

    163

    164

    165

    //参数:

     @Params(value = {@Param(name = "code", dataType = "string"

     in = "formData", description = "code"),

            @Param(name = "userInfo", dataType = "string",

             in = "formData", description = "微信获取用户信息的数据"

             required = true)})

           // 登录:

            public void login() throws Exception {

            Map<String, Object> result = new HashMap<String, Object>();

            // 获取session_key

            Result sessionKeyMap = code2sessionKey(getPara("code"));

            String sessionKey = "";

            if ((boolean)sessionKeyMap.get(Const.RESULT)) {

                sessionKey = String.valueOf(sessionKeyMap.

                get(Const.PROMPT_MSG));

            } else {

                renderJson(sessionKeyMap);

                return;

            }

            JSONObject userInfo = JSONObject.parseObject(getPara("userInfo"));

            // 用户信息

            // 签名校验

            if (!new String(SecureUtil.sha1X16(userInfo.get(WX_RAWDATA)

             + sessionKey, ENCODING_FORMAT), ENCODING_FORMAT)

                .equals(userInfo.getString(WX_SIGNATURE))) {

                renderJson(Result.fail("签名校验失败").build());

                return;

            }

     

            // 加密数据解密

            JSONObject userInfoEncrypted =

                desEncrypt(userInfo.getString(WX_ENCRYPTEDDATA),

                 sessionKey, userInfo.getString(WX_IV));

            if (null == userInfoEncrypted) {

                renderJson(Result.fail("数字水印校验失败").build());

                return;

            }

     

            // 判断是否已注册

            String openId = userInfoEncrypted.getString(WX_USERINFO_OPEN_ID);

            MerchantThird user = merchantThirdService.

            find(new MerchantThird().setOpenId(openId));

            if (Tools.isNotEmpty(user)) {

                MerchantInfo info = merchantInfoService

                .findById(user.getMerchantId());

                if (info == null) {

                    return;

                }

                SysUser sysUser = sysUserService

                .findById(info.getUserId());

     

                result = assembleResult(user, info, sysUser, 

                userInfoEncrypted.getString(WX_USERINFO_NICKNAME),

                 sessionKey);

                renderJson(Result.ok().put(result).build());

                return;

            }

            result.put("msg""该用户没有注册为医生");

            result.put("token", JWTUtil.createToken(openId, sessionKey));

            renderJson(Result.ok().put(result).build());

        }

     

            /**

         * 微信code换取sessionKey等加密信息

         

         * @param code

         * @return

         */

        private Result code2sessionKey(String code) {

     

            String token = HttpUtil.doPost("https://api.weixin.qq.com/sn

            s/jscode2session?appid=" + prop.get(APP_ID)

                "&secret=" + prop.get(API_KEY) + "&js_code="

                 code "&grant_type=authorization_code", null,

                  "UTF-8");

            JSONObject jsonObject = JSONObject.parseObject(token);

            if (null != jsonObject.get(WX_ERROR_CODE)) {

                return Result.fail(jsonObject.getString(WX_ERROR_MSG) 

                "(" + jsonObject.getString(WX_ERROR_CODE) + ")")

                    .build();

            } else {

                return Result.ok(jsonObject.getString(WX_SESSION_KEY))

                .build();

            }

        }

      /**

         * 聚合用户账号信息

         */

        private MemberUser assembleMemberUser(JSONObject userInfoEncrypted, Date date) {

            return new MemberUser().setUserId(Tools.getUniqueId())

            .setCreationTime(date).setUpdateTime(date)

                .setStatus(Const.DEFAULT_STATUS)

                .setOpenId(userInfoEncrypted.getString(WX_USERINFO_OPEN_ID));

        }

     

        /**

         * 聚合用户信息

         

         * @param userInfoEncrypted 参数集

         * @param date 日期

         * @param userId

         * @return

         */

        private MemberInfo assembleMemberInfo(JSONObject userInfoEncrypted,

         Date date, Long userId) {

            return new MemberInfo().setMemberId(Tools.getUniqueId())

                .setName(filterEmoji(userInfoEncrypted.getString(WX_USERINFO_NICKNAME)

                ,"*")).setType(Const.DEFAULT_STATUS)

                .setAvatar(Tools.getUniqueId()).setSex(userInfoEncrypted.getString

                ("gender").equals("2") ? 1 0)

                .setCreationTime(date).setUpdateTime(date).setUserId(userId)

                .setInvitationCode(String.valueOf(Tools.getRandomNum(10000000,

                 99999999)));

        }

      /**

         * 微信水印解密校验

         

         * @param data 加密字符串

         * @param key 密钥

         * @param iv 加密偏移量

         * @return

         * @throws UnsupportedEncodingException

         */

        private JSONObject desEncrypt(String data, String key, String iv) throws

         UnsupportedEncodingException {

            byte[] dataByte =

                AesEncryptUtil.decryptOfDiyIV(Base64.decodeBase64(data),

                 Base64.decodeBase64(key), Base64.decodeBase64(iv));

            JSONObject result = JSONObject.parseObject(new String(dataByte, "UTF-8"));

            // 水印校验

            JSONObject watermark = JSONObject.parseObject(String.valueOf(result.

            get(WX_WATERMARK)));

            if (!watermark.getString(WX_WATERMARK_APP_ID).equals(prop.get(APP_ID))) {

                return null;

            }

            return result;

        }

        /**

         

         * @param user 返回的用户账户信息

         * @param info 返回的token内的信息(仅含memberId和openId)

         * @param nickName 返回的昵称

         * @param result 返回的额外内容

         * @return

         */

        private Map<String, Object> assembleResult(MemberUser user, MemberInfo info,

         String nickName, String sessionKey) {

            Map<String, Object> result = new HashMap<String, Object>(6);

            if (Tools.isEmpty(user) || Tools.isEmpty(info)) {

                result.put(Const.RESULT, false);

                result.put(Const.PROMPT_MSG, "获取参数异常");

            }

            info.put(Const.OPEN_ID, user.getOpenId());

            info.put(Const.SESSION_KEY, sessionKey);

            user.remove("openId");

            user.setName(nickName);

            setAvatarMemberUser(user, info);

            result.put("user", user);

            result.put("accountInfo", memberAccountService.find(new MemberAccount()

            .setMemberId(info.getMemberId())));

            result.put("integralInfo", memberIntegralService.find(new MemberIntegral()

            .setMemberId(info.getMemberId())));

            result.put("token", JWTUtil.createToken(info));

            return result;

        }

      1. 小程序调用wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。

      2. 开发者服务器以code换取 用户唯一标识openid 和 会话密钥session_key。

      1. 当用户未授权过,调用该接口将直接进入fail回调

      2. 当用户授权过,可以使用该接口获取用户信息

      1. 通过调用接口(如 wx.getUserInfo)获取数据时,接口会同时返回 rawData、signature,其中 signature = sha1( rawData + session_key )

      2. 开发者将 signature、rawData 发送到开发者服务器进行校验。服务器利用用户对应的 session_key 使用相同的算法计算出签名 signature2 ,比对 signature 与 signature2 即可校验数据的完整性。

    展开全文
  • java开发微信小程序——二维码生成

    千次阅读 2018-05-12 09:52:05
    工具类(1):public class TwoCode { /* * 获取 token  * 普通的 get 可获 token */ public static String getToken() { try { Map&...String, String&... map = new LinkedHashMap&...
  • java开发微信小程序post请求与get请求

    千次阅读 2018-05-12 09:26:17
    原因:微信小程序api,默认使用的get方式。前端代码按照文档,肯定是这么写.那就入坑了.header头中: 'Content-Type': 'application/json'用在get请求中没问题.POST请求就不好使了.需要改成: "Content-Type&...
  • 4.给绑定小程序而且又关注微信公众号的用户推送公众号消息。 小程序消息推送机制有两种一种是统一模板消息推送一种是客服消息,本章主要介绍在Java端向指定用户推送指定模板的消息。 模板推送又分为两种一种是用小...
  • log.info("微信支付通知接口更新订单表更新成功,订单号:" + map.get("out_trade_no")); success(out); } else { log.error("通知失败"); error(out, "通知失败"); } } else { log.error("签名失败"); ...
  • 最近公司做了一个微信小程序应用,做了一些技术研究也踩了不少坑,不过最终结果不错小程序顺利上线。 在这里做一个开发笔记,主要记录以下几个方面,分别用四篇文章来记录: 1.小程序登录获取,小程序的openId和...
  • 第二篇 获取并解密小程序的加密信息包括用户和手机信息。 ... 1.小程序登录获取,...4.给绑定小程序而且又关注微信公众号的用户推送公众号消息。 好的,开始我们的获取和解密操作吧,主要有以下这些步骤 1.小程序...
  • 需要已上线的小程序!^_^(先写好,测试只能是在线上侧) 也可不用oss上传,只做参考也行,目前以下代码都可亲测运行。 如果需要把头像 从长方形或者正方形什么的切成圆形请跳转点击打开链接 1.pom.xml <!--...
  • 详解java微信小程序开发中加密解密算法一、概述微信推出了小程序,很多公司的客户端应用不仅具有了APP、H5、还接入了小程序开发。但是,小程序中竟然没有提供Java版本的加密数据解密算法。这着实让广大的Java开发...
  • 微信小程序开发【前端+后端(java)】

    万次阅读 多人点赞 2018-07-13 22:19:46
    现在微信小程序越来越火了,相信不少人都通过各种途径学习过微信小程序或者尝试开发,作者就是曾经由于兴趣了解开发微信小程序,最终自己的毕业设计也是开发一个微信小程序。所以现在用这篇博客记录我之前开发的...
  • 开发微信小程序支付的功能前,我们先熟悉下微信小程序支付的业务流程图:不熟悉流程的建议还是仔细阅读微信官方的开发者文档。一,准备工作事先需要申请企业版小程序,并开通“微信支付”(即商户功能)。并获取一下...
  • java微信小程序支付

    2018-06-27 10:54:40
    java开发微信小程序的支付代码,避免开发小程序踩坑。
  • 最近,经历多个微信小程序支付以及小程序退款实战项目,今天编者经过整理,把小程序申请退款的实战项目案例分享给大家,希望能让大家借鉴,在项目开发中少走弯路。   小程序处理退款前提需安装商户安全证书: ...
  • 最近接了一个微信小程序的活,想象中微信小程序应该跟普通的网站开发差不多,实际上就前端来说确实差不多,但是还是遇到不少蛋疼的问题,所以这里记录一下,希望对后来人有所启示。服务器端方面:服务器端是用Java写...
  • 微信小程序 开发中遇到问题总结1.由于小程序wx.request()方法是异步的,在app.js执行ajax后,各分页加载app.js的全局数据时,无法按顺序加载。例://app.jsApp({ajax:function(){let that = this;wx.request({url: '...
  • 近期触碰了微信小程序开发设计,后端开发挑选Java,由于微信小程序的程序执行在腾讯官方的网络服务器上,而我们自己撰写的Java程序执行在我们自己布署的网络服务器上,因此一开始并不是很搞清楚微信小程序怎样与...
  • 最近小程序越来越火,很多开发微信小程序这块,后面给大家讲解下java作为后台开发语言如何开发微信小程序 首先后台采用springboot mybatis作为框架 小程序这块用weui组件 开发小程序的第一步其实就是授权登陆 界面...
  • 主要内容摘抄自微信小程序的API文档,java接口开发是自己总结开发。 一、简介 通过后台接口可以获取小程序任意页面的二维码,扫描该二维码可以直接进入小程序对应的页面。目前微信支持两种二维码,小程序码(左)...
  • java后台微信小程序支付接口开发(实测有用) 后台代码: package cn.ax.web.xcxpay; 工具类 /** @Description: @Date: 2018/4/8 @Author: wcf */ public class WxPayConfig { //小程序appid public static final ...
  • 小程序秒杀-JAVA对接微信小程序付款准备事项支付流程图开发工具和环境JAVA代码注意事项 微信小程序支付文档. 准备事项 appId(小程序分配) 小程序密钥(小程序配置界面获取) 商户号 api密钥(商家后台自己设置) 支付...

空空如也

空空如也

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

java开发微信小程序

java 订阅
微信小程序 订阅