微信公众号接入开发

目录

前言:

一、公众号中配置

1、获取AppID、AppSecret:

 2、配置IP白名单:

问题:

解决:

3、配置JS接口安全域名:

重要:认真阅读系统提示的注意事项:

问题:

解决:

二、前端页面开发:

 三、后端服务开发:

* 流程:

代码:

(1)主要代码:

(2)相关代码:

校验工具:

1、appId、secret校验及生成access_token工具:微信公众平台接口调试工具

2、 微信 JS 接口签名校验工具:微信 JS 接口签名校验工具

错误码:


前言:

先给大家放一个微信官方文档的链接,要知道,接入第三方,最正确的方式,就是看第三方提供的文档,根据自己的需求在文档里找相关内容已经操作步骤。

微信官方文档连接:微信官方文档 | 微信开放文档

这里给大家放的是微信的相关内容开发的总文档链接,大家根据自己需求在里面点击进入查看自己需要的文档即可。

微信功能有太多,这篇文章以接入微信扫一扫为例说明,好了,话不多说,进入正题~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

一、公众号中配置

1、获取AppID、AppSecret:

ps:(1)这个AppID、AppSecret是后面后端服务开发中需要用到的

      *(2)这个AppSecret最好找个地方记下来,后面接入其他服务开发时进行复用,尽量不要重置,若重置,会对之前用到这个AppSecret的服务有影响。

 2、配置IP白名单:

这里的ip应该配置部署服务器的网络出口机器的ip,这里配置后,后面才能获取到正确的access_token

问题:

        调用微信的接口报错 :
                { errcode: 40164, errmsg: 'invalid ip 117.100.47.169 ipv6 ::ffff:117.100.47.169, not in whitelist hint: [39lrcA01394100]' }

解决:

        这个问题就是因为这里没有加入白名单,将报错信息中的ip加入到这个白名单里即可。

3、配置JS接口安全域名:

重要:认真阅读系统提示的注意事项:

        (1)将MP_verify_aZa3PhSE1MBXupsK.txt这个文件下载下来,放到自己的项目路径下

        (2)确保可以访问,最好自己先访问确定一下

        (3)这个路径最好和自己的页面路径位于同一目录层次下,不然可能会找不到页面路径

        (4)配置时,域名签名不要http://或https://,直接域名加路径即可,配置在可访问的文件的上级目录即可,例如:https://wx.qq.com/mp/MP_verify_aZa3PhSE1MBXupsK.txt可以访问到你项目下的这个文件,那么你这里要配置的应该是:wx.qq.com/mp

        (5)一个月最多可以保存5次

问题:

        调用微信的接口报错 : config:invalid url domain

解决:

        这个错的原因就是这里配置的JS接口安全域名和当前页面的域名不一致导致的,将这里的MP_verify_aZa3PhSE1MBXupsK.txt文件和页面放在同一路径下即可。

二、前端页面开发:

        博主是做后端开发的,前端在此不做过多阐述,其实就是后端给前端一个接口,提供以下信息,其他页面开发,放一个文档链接,大家自己查看:
 

微信接入前端JS-SDK说明文档:概述 | 微信开放文档

wx.config({debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。appId: '', // 必填,公众号的唯一标识timestamp: , // 必填,生成签名的时间戳nonceStr: '', // 必填,生成签名的随机串signature: '',// 必填,签名jsApiList: [] // 必填,需要使用的JS接口列表
});

 三、后端服务开发:

        从上面前端所需内容可以看出,后端需要提供给前端的其实就那几个参数,jsApiList是前端的参数,无需返回,我们可以创建一个对象来返回:

@Data
public class WeChatConfigVo {//appIdprivate String appId;//时间戳private Long timestamp;//随机串private String nonceStr;//签名private String signature;
}

* 流程:

 这里大概说一下流程:(appId和appSecret之前页面已经拿到了)

        1、拿到前端传入的当前页面url,注意这个url指的是当前页面的url,并非当前请求的url,所以应该让前端传入,而并非服务端获取

        2、生成随机串、获取当前时间戳

        3、根据appId和appSecret获取access_token

        4、根据access_token去获取ticket

        5、根据随机串、时间戳、ticket和url生成签名

        6、将数据返回给前端页面

代码:

到了大家最开心的时候了,上代码:

(1)主要代码:

package com.sense.cloud.activateService.service;import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.sense.cloud.activateService.utils.HttpRequestUtils;
import com.sense.cloud.activateService.utils.IPUtil;
import com.sense.cloud.activateService.vo.AccessTokenVo;
import com.sense.cloud.activateService.vo.GetWechatConfigParamReq;
import com.sense.cloud.activateService.vo.WeChatConfigVo;
import com.sense.cloud.common.code.ErrorCode;
import com.sense.cloud.common.exception.AppException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;import javax.servlet.http.HttpServletRequest;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;@Service
@Slf4j
public class WeChatConfigService {@Value("${wechatConfig.appId}")private String appId;@Value("${wechatConfig.appSecret}")private String appSecret;// 获取ACCESS_TOKEN的urlpublic final static String GET_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token";// 获取ticket的urlpublic final static String GET_TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket";/*** 获取微信公众号认证参数* @param request* @return*/public WeChatConfigVo getWechatConfigParams(GetWechatConfigParamReq req, HttpServletRequest request){try {if (log.isDebugEnabled()) {log.debug("WeChatConfigService getWechatConfigParams req {}: ", req);}String params = request.getQueryString();if(StringUtils.isEmpty(params)){params="";}else{params="?"+params;}//注意这个url指的是当前页面的url,并非当前请求的url,所以应该让前端传入,而并非服务端获取String url = req.getUrl();log.debug("Url:{}", url);//request.getRequestURL().toString();String ipAddress = IPUtil.getIpAddress(request);// 时间戳long timestamp = (new Date().getTime()) / 1000;// 随机串String nonceStr = UUID.randomUUID().toString();// 获取 access_tokenAccessTokenVo accessToken = getAccessToken(appId, appSecret);String access_token = accessToken.getToken();log.debug("access_token:{}" ,access_token);// 根据 access_token 获取 ticketHashMap<String, String> getTicketParams = new HashMap<>();getTicketParams.put("access_token", access_token);getTicketParams.put("type", "jsapi");String response = HttpRequestUtils.sendGet(GET_TICKET_URL, getTicketParams);if (StringUtils.isEmpty(response)) {log.debug("获取微信公众号ticket失败, response == > {}", response);}JSONObject jsonObject = JSONObject.parseObject(response);log.debug("getTicket response:{}" ,JSONObject.toJSONString(jsonObject));String ticket = jsonObject.getString("ticket");if(log.isDebugEnabled()) {log.debug("要加密的参数:"+nonceStr+" "+ticket+" "+timestamp+" "+url);}//根据随机串、时间戳、ticket和url生成签名String signature = getsig(nonceStr,ticket,String.valueOf(timestamp),url);WeChatConfigVo weChatConfigVo = new WeChatConfigVo();weChatConfigVo.setAppId(appId);weChatConfigVo.setTimestamp(timestamp);weChatConfigVo.setNonceStr(nonceStr);weChatConfigVo.setSignature(signature);log.debug(JSONObject.toJSONString(weChatConfigVo));return weChatConfigVo;} catch (Exception e) {log.error("获取微信公众号认证参数失败 :", e);throw e;}}/*** 获取access_token*/public static AccessTokenVo getAccessToken(String appid, String appsecret) {AccessTokenVo accessToken = null;Map<String, String> paramMap = new HashMap<>();paramMap.put("grant_type", "client_credential");paramMap.put("appid", appid);paramMap.put("secret", appsecret);String response = HttpRequestUtils.sendGet(GET_ACCESS_TOKEN_URL, paramMap);if (StringUtils.isEmpty(response)) {log.debug("获取获取access_token失败");throw new AppException(ErrorCode.TOKEN_INVALID);}if (log.isDebugEnabled()) {log.debug("resp: {}", response);}JSONObject jsonObject = JSONObject.parseObject(response);if (log.isDebugEnabled()) {log.debug("respJSONObject : {}", jsonObject.toJSONString());}// 如果请求成功if (null != jsonObject) {try {accessToken = new AccessTokenVo();accessToken.setToken(jsonObject.getString("access_token"));accessToken.setExpiresIn(jsonObject.getString("expires_in"));} catch (JSONException e) {accessToken = null;// 获取token失败}}return accessToken;}/*** 拼接 signature 签名* @param noncestr* @param jsapi_ticket* @param timestamp* @param url* @return*/private static String getsig(String noncestr,String jsapi_ticket,String timestamp,String url){String[] paramArr = new String[] { "jsapi_ticket=" + jsapi_ticket,"timestamp=" + timestamp, "noncestr=" + noncestr, "url=" + url };Arrays.sort(paramArr);// 将排序后的结果拼接成一个字符串String content = paramArr[0].concat("&"+paramArr[1]).concat("&"+paramArr[2]).concat("&"+paramArr[3]);String gensignature = null;try {MessageDigest md = MessageDigest.getInstance("SHA-1");// 对拼接后的字符串进行 sha1 加密System.out.println("拼接加密签名:"+content);byte[] digest = md.digest(content.getBytes());gensignature = byteToStr(digest);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}// 将 sha1 加密后的字符串与 signature 进行对比if (gensignature != null) {return gensignature;// 返回signature} else {return "false";}}/*** 将字节数组转换为十六进制字符串** @param byteArray* @return*/private static String byteToStr(byte[] byteArray) {String strDigest = "";for (int i = 0; i < byteArray.length; i++) {strDigest += byteToHexStr(byteArray[i]);}return strDigest;}/*** 将字节转换为十六进制字符串** @param mByte* @return*/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;}
}

(2)相关代码:

package com.sense.cloud.activateService.controller;import com.sense.cloud.activateService.service.WeChatConfigService;
import com.sense.cloud.activateService.vo.GetWechatConfigParamReq;
import com.sense.cloud.activateService.vo.WeChatConfigVo;
import com.sense.cloud.common.code.ErrorCode;
import com.sense.cloud.common.exception.AppException;
import com.sense.cloud.common.vo.BaseRes;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;/*** @Author: Hu Wentao* @Date: 2021/11/1 15:55* @Description: 微信公众号配置*/
@Slf4j
@CrossOrigin
@RestController
public class WechatConfigController {@Autowiredprivate WeChatConfigService weChatConfigService;/*** 获取微信公众号参数* @param request* @return*/@PostMapping("/wechat/getWechatConfigParam")public BaseRes<WeChatConfigVo> getWechatConfigParam(@RequestBody GetWechatConfigParamReq req, HttpServletRequest request) {try {if (log.isDebugEnabled()) {log.debug("WechatConfigController getWechatConfigParam : {}", req);}if (req == null || StringUtils.isEmpty(req.getUrl())) {throw new AppException(ErrorCode.ERR_PARA);}WeChatConfigVo configVo = weChatConfigService.getWechatConfigParams(req, request);return BaseRes.ok(configVo);} catch (Exception e) {log.error("获取微信公众号参数失败 :", e);return BaseRes.fail(ErrorCode.ERR_SYS);}}
}
package com.sense.cloud.activateService.vo;import lombok.Data;/*** @Author: Hu Wentao* @Date: 2021/11/2 15:58* @Description: 获取微信公众号配置参数请求体*/@Data
public class GetWechatConfigParamReq {//urlprivate String url;
}

校验工具:

1、appId、secret校验及生成access_token工具:微信公众平台接口调试工具

2、 微信 JS 接口签名校验工具:微信 JS 接口签名校验工具

错误码:

这里放些从微信官方扒下来的错误码信息,方便大家查错

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/142877.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

电子科技大学编译原理复习笔记(三):控制结构

目录 前言 重点一览 语句级控制结构 单元级控制结构 四种单元级控制结构 本章小结 前言 本复习笔记基于张老师的课堂PPT&#xff0c;供自己期末复习与学弟学妹参考用。 重点一览 语句级控制结构 定义&#xff1a;用来构造各种语句执行顺序的机制 传统三种语句级控制结…

geotools简介

geotools简介 官网 https://docs.geotools.org/latest/userguide/index.html 架构图 特性 1. 主要特性 Geotools主要提供各种GIS算法&#xff0c;实现各种数据格式的读写和显示。在显示方面要差一些&#xff0c;只是用Swing实现了地图的简单查看和操作。用户可以根据Geoto…

Linux学习笔记 --- Linux基础命令Part2

2.9 查找命令(which、find&#xff09; 目标&#xff1a;1. 掌握使用which命令查找命令的程序文件 2. 掌握使用find命令查找指定文件 which命令 我们在前面学习的Linux命令&#xff0c;其实它们的本体就是一个个的二进制可执行程序。 和Windows系统中的.exe文件&#x…

清除一键还原精灵开机热键F11的正确方法

刚开通博客园&#xff0c;就写我刚才才处理的一个问题吧。 先描述一下问题吧&#xff0c;我以前才装Win7系统的时候&#xff0c;想弄个还原&#xff0c;于是去下载了一个一键还原精灵&#xff0c;结果安装失败了&#xff0c;不过开机热键却保留了下来&#xff0c;每次开机都要提…

u深度重装系统详细教程_u深度一键还原精灵电脑重装系统使用教程

电脑已经是家家户户必备的电子产品&#xff0c;有了它可以为我们带来一系列不同的乐趣以及帮助。当然&#xff0c;电脑也有出差错的时候&#xff0c;在遇上电脑系统无法正常使用时&#xff0c;大多数人会使用附带有应急系统的u盘启动盘为电脑重装系统的操作。但是pe系统中附带的…

冰点还原精灵和惠普增霸卡安装软件的方法

还原系统无法安装东西 适用于冰点还原精灵和惠普增霸卡发现这个方法的经过 适用于冰点还原精灵和惠普增霸卡 在我们使用还原系统如健康上网专家或者惠普增霸卡这样的还原系统的时候&#xff0c;难免出现想后期安装点软件。但是安装后电脑重启后就被还原了&#xff0c;软件也就…

破解还原卡的方法总结

分享一下我老师大神的人工智能教程&#xff01;零基础&#xff0c;通俗易懂&#xff01;http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章。分享知识&#xff0c;造福人民&#xff0c;实现我们中华民族伟大复兴&#xff01; 破解三茗还原卡还原卡及还原精灵的破解还原…

冰点还原精灵卸载

冰点还原是一个系统的保护软件&#xff0c;不论什么原因你的系统出现了故障&#xff0c;它都可以快速的恢复到你原先的状态和设置。它会随时记录你的操作&#xff0c;当前打开的文件&#xff0c;运行着的程序和各项设置。 但是当你有一天不想用他了&#xff0c;你是否懂…

冰点还原无法修改计算机时间,系统还原后无法更改系统时间?这个方法必须会...

原标题&#xff1a;系统还原后无法更改系统时间&#xff1f;这个方法必须会 对于公用电脑&#xff0c;为了防止乱装软件&#xff0c;都会安装了冰点还原精灵这类的系统还原软件来保护电脑系统。但是之后发现系统时间不对&#xff0c;双击修改时弹出“您没有适当的特级权&#x…

按键精灵 手机 oracle,按键精灵Android版:软件使用

1.1按键精灵Android版(APP) 1.1.1脚本管理器 按键精灵Android版的APP在界面功能层次上尽量扁平化&#xff0c;大多数操作均在脚本管理器内完成&#xff0c;界面由菜单栏、脚本列表及可伸缩的脚本操作栏组成&#xff0c;用户可以在这里直接进行脚本的创建、管理与编辑。(如图1) …

冰点还原精灵是怎么用的

有很多网友说装了冰点还原精灵后想卸载&#xff0c;可又不知道怎么卸?网上下的工具不是报毒就是用不了&#xff0c;在这里小编详细图文教您们一遍。 冰点是利用驱动的形式加入操作系统的内核模块中来实现其还原功能的&#xff0c;它必须依附于原来的系统,一旦进入另外一个系统…

冰点还原精灵有什么作用

冰点还原精灵是一款超强大的系统还原软件&#xff0c;可使计算机配置免遭破坏&#xff0c;从而将 IT帮助台收到的求助数量和耗费的成本降低 75%。它可以确保每个台式机、笔记本和服务器始终处于部署该软件之初的最佳运行状态。 公司&#xff0f;组织的计算机的可靠性得以显著提…

分享一款好用的电脑背单词软件

推荐一下这款单词风暴&#xff0c;虽然看起来很老了&#xff0c;但是好用&#xff0c;功能多。 下载地址 单词风暴免费版下载_官方免费版_单词风暴官方网站 (wordstorming.com) 下面是主界面 需要登陆ID:285804755-QGJTE-HCUMQ 下面是词库 不过我最喜欢的功能是这里面可以…

MYSQL数据库同步工具

MYSQL数据库同步工具 MYSQL数据库同步工具功能说明配图 MYSQL数据库同步工具 GIT地址&#xff1a;https://gitee.com/michlee/mysql-sync 因开发需要&#xff0c;经常要同步MYSQL数据库结构及部分基础数据到其他生产服务器。而且有时候需要一次性同步到多台服务器&#xff0c;…

数据库同步工具的测试要点

数据库同步过程&#xff0c;最严格的指标&#xff1a; 第一是效率&#xff0c;即每秒同步SQL条数&#xff1b; 第二是一致性&#xff0c;即主库产生的数据&#xff0c;备库同步后是否一致&#xff1b; 第三是完整性&#xff0c;即当同步的各个环节出现问题时&#xff0c;如何考…

两个数据库数据实时同步-多元异构数据实时同步工具

SyncNavigator是一款功能强大的数据库同步软件&#xff0c;适用于SQL SERVER, MySQL&#xff0c;具有自动/定时同步数据、无人值守、故障自动恢复、同构/异构数据库同步、断点续传和增量同步等功能&#xff0c;支持Windows xp以上所有操作系统&#xff0c;适用于大容量数据库快…

DataX数据同步工具使用

1.DataX 简介 DataX 是阿里云 DataWorks 数据集成 的开源版本&#xff0c;主要就是用于实现数据间的离线同步。 DataX 致力于实现包括关系型数据库&#xff08;MySQL、Oracle 等&#xff09;、HDFS、Hive、ODPS、HBase、FTP 等 各种异构数据源&#xff08;即不同的数据库&…

数据同步工具—Sqoop

数据同步工具—Sqoop 1 Sqoop概述 传统的应用程序管理系统,即应用程序与使用RDBMS的关系数据库的交互,是产生大数据的来源之一。由RDBMS生成的这种大数据存储在关系数据库结构中的关系数据库服务器中。 当大数据存储和Hadoop生态系统的MapReduce,Hive,HBase,Cassandra,…

数据库同步软件介绍以及使用说明(SyncNavigator多元异构数据实时同步工具)

SyncNavigator是一款功能强大的数据库同步软件&#xff0c;适用于SQL SERVER, MySQL&#xff0c;具有自动/定时同步数据、无人值守、故障自动恢复、同构/异构数据库同步、断点续传和增量同步等功能&#xff0c;支持Windows xp以上所有操作系统&#xff0c;适用于大容量数据库快…

mysql数据库同步工具_mysql同步工具_mysql数据库同步

下载网站:www.SyncNavigator.CN 客服QQ1793040 ---------------------------------------------------------- 关于HKROnline SyncNavigator 注册机价格的问题 HKROnline SyncNavigator 8.4.1 企业版数据同步软件 自2009年第一个版本开发出来以来&#xff0c;经过8年不断地根…