实现微信分享springboot后端demo

前言

微信的开发文档写的像一坨屎,并且只有php的demo,非常不友好

api简介

前端通过jsapi调用微信接口之前,都需要初始化,主要需要appId, timestamp, noceStr, signature,其中appId是静态的,由公众号后台提前配置好,timestamp, noceStr, signature都是动态的,一般通过java后端通过接口来提供,因此本文的重点就是后端如何处理获取并返回timestamp, noceStr, signature

image.png

主要流程

  • 1、申请一个公众号
    过程省略
  • 2、获取appId和appSecret
    进入公众号后台,点击开发 -> 基本配置
    基本配置

    页面会提示你是否成为开发者,走正常输入密码/微信扫码流程,成功后会自动分配一个appID,开发者密码需要手动配置,配置完成后,设置后端调用接口获取access_token的IP白名单(该ip为后端服务所部署的服务器所在的ip,必须设置,否则无法获取access_token)
    开发信息
  • 3、服务器配置
    需要填写URL和Token(自定义),EncodingAESKey可以随机生成。
    服务器配置

    填写的URL需要用备案过的域名(免费的内网穿透的域名似乎不行),并且必须是80端口,需要我们写一个接口,并部署在域名下,URL对应接口的访问路径。在点击下面的提交按钮时,微信会发一个GET请求到这个接口,包括四个字符串:
    signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
    timestamp 时间戳
    nonce 随机数
    echostr 随机字符串
    我们的接口需要接受这四个参数,用微信指定的验证方式对参数进行校验,校验方式如下:
    1)将token、timestamp、nonce三个参数进行字典序排序
    2)将三个参数字符串拼接成一个字符串进行sha1加密
    3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
    若校验成功,则接口需要返回echostr参数内容。
    JAVA代码:
/**
* WxRequest是一个包含了微信传过来的四个参数的实体类,返回true表示验证成功
**/
public boolean valid(WxRequest request){
        String signature = request.getSignature();
        String timestamp = request.getTimestamp();
        String nonce = request.getNonce();
        String echostr = request.getEchostr();
        
        String token = "你在配置页面填写的Token";

        String[] arr = new String[]{token, timestamp, nonce};
        Arrays.sort(arr);
        // 2. 将三个参数字符串拼接成一个字符串进行sha1加密
        StringBuilder content = new StringBuilder();
        for (String anArr : arr) {
            content.append(anArr);
        }

        MessageDigest md = MessageDigest.getInstance("SHA-1");
        byte[] digest = md.digest(content.toString().getBytes());
        tmpStr = byteToStr(digest);
        return tmpStr != null && tmpStr.equals(signature.toUpperCase());
}


private static String byteToStr(byte[] byteArray) {
        StringBuilder strDigest = new StringBuilder();
        for (byte aByteArray : byteArray) {
            strDigest.append(byteToHexStr(aByteArray));
        }
        return strDigest.toString();
    }

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];
        return new String(tempArr);
    }
  • 4、配置js安全域名
    点击微信公众号后台右上角,选择功能设置

    image.png

    设置js安全域名,微信需要判断js调用接口的域名是否是经过我们的配置,并且安全,这个域名指的是微信分享页面所处的域名
    image.png

    首先需要将红色框框里的文件下载下来,放到域名对应的根目录下(也可以指定目录),然后填写域名(内网穿透的临时域名同样不可用)。在点击保存的时候,微信会到这个域名下寻找我们放置到根目录中的下载文件并验证
    image.png

  • 5、获取前端所需的三个参数
    服务器配置完以后,表示appID和appSecret正式生效,前端也有了调用jsapi的权限,把appID交给前端,就可以开始写三个参数的获取接口了。
    其中noncestr(随机字符串)和timestamp都是我们自定义的,signature则需要通过Http向微信请求,也就是说问题重点转化为如何获取signature。
    获取signature主要分三步:

    • ① 获取access_token
      通过get请求访问https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET,参数说明如下:
      grant_type 获取access_token填写client_credential
      appid 第三方用户唯一凭证
      secret 第三方用户唯一凭证密钥,即appsecret
      返回内容是包括access_token和expires_in(单位秒)两个字段的json字符串,由于每天获取access_token的次数有限,一般需要将其缓存起来
    • ② 获取ticket
      get请求https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
      返回内容是包含了errcode、errmsg、ticket、expires_in(单位秒)字段的json字符串
    • ③ 生成signature
      签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。
      对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。
      这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。
      具体的java代码可以看这里
      如果不确定自己生成的签名是否正确,可以到微信官方signature验证
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容