-
获取资源的url和token
2020-12-09 14:11:37<div><p>获取某个资源的url和token</p><p>该提问来源于开源项目:qiniu/legacy-ios-sdk</p></div> -
微信公众开发URL和token填写详解
2018-09-11 09:42:32【转】微信公众开发URL和token填写详解 很多人不明白微信公众号开发者中心服务器配置里面的url和token是什么,不会填写。看了教程也不理解是什么,本文详述一下这个问题。 第一步:作为一名微信公众号开发者,别人...很多人不明白微信公众号开发者中心服务器配置里面的url和token是什么,不会填写。看了教程也不理解是什么,本文详述一下这个问题。
第一步:作为一名微信公众号开发者,别人进入你的微信公众号,肯定会看见某些网页,或者给你发某些信息,你需要实时自动回复,所以你需要一个24小时为用户服务的服务器。我们所要填写的url就是你提供的服务器的地址,前提是这个服务器的地址你要能够访问,且能够控制。而token是用来验证的。
第二步:然后你需要一个服务器,服务器可以自己购买,也能用新浪sae,百度bae。方法是进入其开发者中心,注册一个开发者账号。并进行实名认证!(没有进行实名认证的小伙伴们是无法成功的)
第三步:注册完毕后,我们进入控制台创建一个新应用。
第四步:创建完应用之后我们进入左侧代码管理,提示我们创建一个新版本,点击确定创建一个新版本。然后选择第一张图中的编辑代码选项。弹出第二张图,双击index.php编辑本页代码。
第五步:将下面的代码加标点复制进去。将define("TOKEN", "weixin")这句话中的weixin改成你自己的token,例如zijidetoken;然后点击右上角的全部保存。
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
<?php
/**
* wechat php test
*/
//define your token
define(
"TOKEN"
,
"weixin"
);
$wechatObj
=
new
wechatCallbackapiTest();
$wechatObj
->valid();
class
wechatCallbackapiTest{
public
function
valid(){
$echoStr
=
$_GET
[
"echostr"
];
//valid signature , option
if
(
$this
->checkSignature()){
echo
$echoStr
;
exit
;
}
}
public
function
responseMsg(){
//get post data, May be due to the different environments
$postStr
=
$GLOBALS
[
"HTTP_RAW_POST_DATA"
];
//extract post data
if
(!
empty
(
$postStr
)){
$postObj
= simplexml_load_string(
$postStr
,
'SimpleXMLElement'
, LIBXML_NOCDATA);
$fromUsername
=
$postObj
->FromUserName;
$toUsername
=
$postObj
->ToUserName;
$keyword
= trim(
$postObj
->Content);
$time
= time();
$textTpl
= "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
if
(!
empty
(
$keyword
)){
$msgType
=
"text"
;
$contentStr
=
"Welcome to wechat world!"
;
$resultStr
= sprintf(
$textTpl
,
$fromUsername
,
$toUsername
,
$time
,
$msgType
,
$contentStr
);
echo
$resultStr
;
}
else
{
echo
"Input something..."
;
}
}
else
{
echo
""
;
exit
;
}
}
private
function
checkSignature(){
$signature
=
$_GET
[
"signature"
];
$timestamp
=
$_GET
[
"timestamp"
];
$nonce
=
$_GET
[
"nonce"
];
$token
= TOKEN;
$tmpArr
=
array
(
$token
,
$timestamp
,
$nonce
);
sort(
$tmpArr
);
$tmpStr
= implode(
$tmpArr
);
$tmpStr
= sha1(
$tmpStr
);
if
(
$tmpStr
==
$signature
){
return
true;
}
else
{
return
false;
}
}
}
?>
第六步:按照第一幅图中又键点击index.php文件,选择通过URL访问得到第二幅图,复制地址栏的网址,这就是你微信开发需要填写的url,而你需要填写的token就是你上一步骤自己修改后的token。
第七步:填写完毕,提交成功。好了,你可以开始你的微信公众开发了。
第八步:总结1.开发者一定要实名认证后才行,不然会提示验证token失败。2.微信开发需要php知识。
-
微信公众号URL和Token配置验证
2018-08-30 14:46:23微信公众号验证URL和Token的配置,以及在项目中获取Token进入正题首先准备一些事情; 测试的公众号:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 获得appId 和appsecret 为配置微信服务端; ...微信公众号验证URL和Token的配置,以及在项目中获取Token
进入正题首先准备一些事情;
测试的公众号:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
获得appId 和appsecret 为配置微信服务端;
配置接口信息, 稍后讲解;
为了方便微信测试 :http://www.ngrok.cc/ 看下图文字叙述,没什么可说的,
java web环境:下图采用的是 spring4MVC 、jdk1.8、 tomact8,使用的是maven管理工具;
到此准备的差不多了; 下面开始配置微信环境;
还得多说两句,微信开发主要就是通过微信的令牌获得微信的一些特权,为了达到这个效果,需要让微信知道我们的服务器, 我们服务器写一个微信接口供微信调用,同时响应微信发送的token验证,官方文档有介绍,不再赘述,上代码;
package com.WeChat.verify;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/wx")
public class WeixinServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String signature = req.getParameter("signature");// 微信加密签名
String timestamp = req.getParameter("timestamp");// 时间戳
String nonce = req.getParameter("nonce");// 随机数
String echostr = req.getParameter("echostr");// 随机字符串
PrintWriter out = resp.getWriter();
if(CheckUtil.checkSignature(signature, timestamp, nonce)){
out.print(echostr);
}
}
/
* 消息的接收与响应
/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp){
}
}
校验签名
package com.WeChat.verify;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
public class CheckUtil {
// 与接口配置信息中的Token要一致
private static String token = "Token";
/
校验签名
/
public static boolean checkSignature(String signature, String timestamp, String nonce) {
System.out.println("signature:" + signature + "timestamp:" + timestamp + "nonc:" + nonce);
String[] arr = new String[] { token, timestamp, nonce };
// 将token、timestamp、nonce三个参数进行字典序排序
Arrays.sort(arr);
StringBuilder content = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
content.append(arr[i]);
}
MessageDigest md = null;
String tmpStr = null;
try {
md = MessageDigest.getInstance("SHA-1");
// 将三个参数字符串拼接成一个字符串进行sha1加密
byte[] digest = md.digest(content.toString().getBytes());
tmpStr = byteToStr(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
content = null;
// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
System.out.println(tmpStr.equals(signature.toUpperCase()));
return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : 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;
}
}
至此,微信和我们的服务器,能沟通了偷笑,我们继续,,,
由于我们启动时需要加载微信的accessToken,和JSAPI接口的飞机票,JSApiTicket,下面配置web.xml
<servlet-name>InitAccessTokenServlet</servlet-name>
<servlet-class>com.oa.wx.utils.InitAccessTokenServlet</servlet-class>
<init-param>
<param-name>appid</param-name>
<param-value>wx4fb90asd5015e9820</param-value>
</init-param>
<init-param>
<param-name>appsecret</param-name>
<param-value>f7850725c4fff0423349c2a62e2d430</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
上面配置的目的就是当项目启动时加载 InitAccessTokenServlet 获取我们想要的信息;
为了方便我们建立两个实体类用于获取参数 ,同时准备一些类供加载时调用:
package com.oa.wx.utils;
public class AccessToken implements java.io.Serializable {
/
/
private static final long serialVersionUID = 1L;
// 接口访问凭证
private String accessToken;
// 凭证有效期,单位:秒
private int expiresIn;
public AccessToken() {
}
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public int getExpiresIn() {
return expiresIn;
}
public void setExpiresIn(int expiresIn) {
this.expiresIn = expiresIn;
}
}
package com.oa.wx.utils;
public class JsApiTicket implements java.io.Serializable {
/
/
private static final long serialVersionUID = 1L;
private String ticket;
// 凭证有效期,单位:秒
private int expiresIn;
public JsApiTicket() {
}
public String getTicket() {
return ticket;
}
public void setTicket(String ticket) {
this.ticket = ticket;
}
public int getExpiresIn() {
return expiresIn;
}
public void setExpiresIn(int expiresIn) {
this.expiresIn = expiresIn;
}
}
开通了一个https协议,但是不是国际认证的,自己做的证书,访问一个接口的时候比如 https:/xx.xx.xx.xx/a?c=d的时候,如果在游览器访问,需要用户确认的。如果我要模拟服务器向这个接口发送请求,就会报错误。
我的原代码是:1 创建信任管理器
/*
* 信任管理器
*
* @date 2013-04-10
/
public class MyX509TrustManager implements X509TrustManager {
// 检查客户端证书
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
// 检查服务器端证书
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
// 返回受信任的X509证书数组
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
编写获取accessToken 和飞机票的接口,在网上找了个例子,编写了个工具类如下、
package com.oa.wx.utils;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Formatter;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class WeiXinUtil {
// 凭证获取(GET)——access_token
public final static String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
// 微信JSSDK的ticket请求URL地址——jsapi_ticket
public final static String JSAPI_TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
//微信APPID
public final static String APP_ID="wx4fb9062502315e9820";
//微信APPSECRET
public final static String APPSECRET="19751e4ebd34c56e763f28b1a8c8263053";
/*
* 排序方法
*
* @param token
* @param timestamp
* @param nonce
* @return
/
public static String sort(String token, String timestamp, String nonce) {
String[] strArray = { token, timestamp, nonce };
Arrays.sort(strArray);
StringBuilder sbuilder = new StringBuilder();
for (String str : strArray) {
sbuilder.append(str);
}
return sbuilder.toString();
}
/*
* 发送https请求
*
* @param requestUrl
* 请求地址
* @param requestMethod
* 请求方式(GET、POST)
* @param outputStr
* 提交的数据
* @return rootNode(通过rootNode.get(key)的方式获取json对象的属性值)
/
public static JsonNode httpsRequest(String requestUrl, String requestMethod, String outputStr) {
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = null;
StringBuffer buffer = new StringBuffer();
try {
// 创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = { new MyX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
// 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
URL url = new URL(requestUrl);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(ssf);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
// 设置请求方式(GET/POST)
conn.setRequestMethod(requestMethod);
//conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
if ("GET".equalsIgnoreCase(requestMethod))
conn.connect();
// 当outputStr不为null时向输出流写数据
if (null != outputStr) {
OutputStream outputStream = conn.getOutputStream();
// 注意编码格式
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
// 从输入流读取返回内容
InputStream inputStream = conn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
// 释放资源
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
inputStream = null;
conn.disconnect();
rootNode = mapper.readTree(buffer.toString());
} catch (Exception e) {
e.printStackTrace();
}
return rootNode;
}
/*
* 获取接口访问凭证
*
* @param appid
* 凭证
* @param appsecret
* 密钥
* @return
/
public static AccessToken getAccessToken() {
AccessToken accessToken = null;
String requestUrl = ACCESS_TOKEN_URL.replace("APPID", APP_ID).replace("APPSECRET", APPSECRET);
// 发起GET请求获取凭证
JsonNode rootNode = httpsRequest(requestUrl, "GET", null);
System.out.println("rootNoderootNoderootNode"+rootNode);
if (null != rootNode.get("access_token")) {
accessToken = new AccessToken();
accessToken.setAccessToken(rootNode.get("access_token").textValue());
accessToken.setExpiresIn(toInt(rootNode.get("expires_in").toString()));
}
return accessToken;
}
/*
* 调用微信JS接口的临时票据
*
* @param access_token
* 接口访问凭证
* @return
/
public static JsApiTicket getJsApiTicket(String access_token) {
String requestUrl = JSAPI_TICKET_URL.replace("ACCESS_TOKEN", access_token);
// 发起GET请求获取凭证
JsonNode rootNode = httpsRequest(requestUrl, "GET", null);
System.out.println(rootNode.toString());
JsApiTicket jsApiTicket = null;
if (null != rootNode.get("ticket")) {
jsApiTicket = new JsApiTicket();
jsApiTicket.setTicket(rootNode.get("ticket").textValue());
jsApiTicket.setExpiresIn(toInt(rootNode.get("expires_in").toString()));
}
return jsApiTicket;
}
public static Integer toInt(String str) {
if (str == null || str.equals("")) {
return null;
}
return Integer.valueOf(str);
}
/*
* 获取接口访问凭证
*
* @param appid
* 凭证
* @param appsecret
* 密钥
* @return
/
public static String getAuthorize(String url) {
AccessToken accessToken = null;
String requestUrl = ACCESS_TOKEN_URL.replace("APPID", APP_ID).replace("APPURL", url);
// 发起GET请求获取凭证
JsonNode rootNode = httpsRequest(requestUrl, "GET", null);
System.out.println(rootNode.toString());
return rootNode.toString();
}
public static String create_nonce_str() {
return UUID.randomUUID().toString();
}
public static String create_timestamp() {
return Long.toString(System.currentTimeMillis() / 1000);
}
public static String byteToHex(final byte[] hash) {
Formatter formatter = new Formatter();
for (byte b : hash) {
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
public static Map<String, String> sign(String jsapi_ticket, String url) {
Map<String, String> ret = new HashMap<String, String>();
String nonce_str = WeiXinUtil.create_nonce_str();
String timestamp = WeiXinUtil.create_timestamp();
String string1;
String signature = "";
// 注意这里参数名必须全部小写,且必须有序
string1 = "jsapi_ticket=" + jsapi_ticket +
"&noncestr=" + nonce_str +
"×tamp=" + timestamp +
"&url=" + url;
System.out.println(string1);
try {
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(string1.getBytes("UTF-8"));
signature = WeiXinUtil.byteToHex(crypt.digest());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
ret.put("url", url);
ret.put("appId",WeiXinUtil.APP_ID);
ret.put("jsapi_ticket", jsapi_ticket);
ret.put("nonceStr", nonce_str);
ret.put("timestamp", timestamp);
ret.put("signature", signature);
return ret;
}
}
access_token与jsapi_ticket 需要全局缓存为什么我就不说了,既然来看了就应该知道了
我用的是spring容器加载完毕后监听器,就是容器加载完毕调用 ApplicationListener
这样可以获取access_token jsapi_ticket 缓存到servletcontext中(servletcontext全局容易 全局唯一 全局共享)
首先看一下全局servletcontext;
package com.oa.wx.utils;
import javax.servlet.ServletContext;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;
/
@ClassName: ServletContextUtil
* @author yangwl
* @date 2016年5月11日 下午4:54:16
* @Description:
* 全局缓存servletcontext
/
public final class ServletContextUtil {
private static ServletContext serveltContext = null;
private ServletContextUtil(){};
public synchronized static ServletContext get() {
if(null == serveltContext) {
WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
serveltContext = webApplicationContext.getServletContext();
}
return serveltContext;
}
}
由于微信的一些情况 accessToken 每天的获取数量是有限的,所以需要做缓存处理,在这里写了两个线程,一个是获取 accessToken ,一个是JsApiTicket;
package com.oa.wx.utils;
import javax.servlet.ServletContext;
public class AccessTokenThread implements Runnable {
public static String appid = "";
public static String appsecret = "";
public static AccessToken accessToken = null;
@Override
public void run() {
while (true) {
try {
accessToken = WeiXinUtil.getAccessToken();
if (null != accessToken) {
System.out.println("accessToken初始化成功:" + accessToken.getAccessToken());
// 全局缓存access_token
ServletContext servletContext = ServletContextUtil.getServletContext();
servletContext.setAttribute("access_token", accessToken.getAccessToken());
// 有效期(秒)减去200秒,乘以1000(毫秒)——也就是在有效期的200秒前去请求新的accessToken
Thread.sleep((accessToken.getExpiresIn() - 200) 1000);
} else {
// 等待一分钟,再次请求
Thread.sleep(60 1000);
}
} catch (Exception e) {
try {
// 等待一分钟,再次请求
Thread.sleep(60 1000);
} catch (Exception ex) {
ex.printStackTrace();
}
e.printStackTrace();
}
}
}
}
package com.oa.wx.utils;
import javax.servlet.ServletContext;
public class JsApiTicketThread implements Runnable {
@Override
public void run() {
while (true) {
try {
ServletContext servletContext = ServletContextUtil.getServletContext();
String access_token = (String) servletContext.getAttribute("access_token");
JsApiTicket jsApiTicket = null;
if(null != access_token && !"".equals(access_token)){
// 获取jsapi_ticket
jsApiTicket = WeiXinUtil.getJsApiTicket(access_token);
if (null != jsApiTicket) {
System.out.println("jsapi_ticket获取成功:" + jsApiTicket.getTicket());
// 全局缓存jsapi_ticket
servletContext.setAttribute("jsapi_ticket", jsApiTicket.getTicket());
Thread.sleep((jsApiTicket.getExpiresIn() - 200) 1000);
}
}
Thread.sleep(60 1000);
} catch (Exception e) {
try {
Thread.sleep(60 1000);
} catch (Exception ex) {
ex.printStackTrace();
}
e.printStackTrace();
}
}
}
}
最后我们编写 InitAccessTokenServlet ,首次加载时调用;
package com.oa.wx.utils;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
public class InitAccessTokenServlet extends HttpServlet {
/
*/
private static final long serialVersionUID = 1L;
public void init() throws ServletException {
// 获取web.xml中配置的参数
String WX_APPID ="wx4fb90625015e9820";
String WX_APPSECRET = "19751e4ebdc56e763f28b1a8c8263053";
AccessTokenThread.appid = WX_APPID;
AccessTokenThread.appsecret = WX_APPSECRET;
if ("".equals(AccessTokenThread.appid) || "".equals(AccessTokenThread.appsecret)) {
System.out.println("appid和appsecret未给出");
} else {
new Thread(new AccessTokenThread()).start();
new Thread(new JsApiTicketThread()).start();
}
}
}
至此,微信服务端配置环境已结束,以上代码均在网上整理,为查阅方便整理到一起,如有侵权行为请与我联系。以上代码仅供参考,如遇问题可以留言!
-
微信公众号开发(接口配置信息URL和Token)
2019-07-11 18:30:281、因为再微信公众号开发关键字回复的时候需要使用到接口配置信息URL和Token. 刚开始配置的时候总是失败,原因是自己使用花生壳的外网的端口不是80,所以我将外网端口该为了80,后来配置成功。 重点:1、这个一定...1、因为再微信公众号开发关键字回复的时候需要使用到接口配置信息URL和Token.
刚开始配置的时候总是失败,原因是自己使用花生壳的外网的端口不是80,所以我将外网端口该为了80,后来配置成功。
重点:1、这个一定是使用外网可以访问的url;2、外网端口一定是80的,好像还有一个不过我忘记啦,自己本地的端口可以随便(我的是8080)3、本地地址可以外网访问的话,可以使用花生壳,(是免费的,可以直接在官网下载,然后注册下就可以啦)4、token是自己随便设置的
1、本地写一个微信访问的方法:
package com.uvksoft.mobile.web.agent.wx; import javax.servlet.http.HttpServletRequest; import com.uvksoft.common.util.wx.SignUtil; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.io.PrintWriter; import java.util.Enumeration; import javax.servlet.http.HttpServletResponse; @RestController public class AgentWeixinReplyController { @RequestMapping(value = "/wx/reply.do") public void get(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("========WechatController========= "); Enumeration pNames = request.getParameterNames(); while (pNames.hasMoreElements()) { String name = (String) pNames.nextElement(); String value = request.getParameter(name); // out.print(name + "=" + value); String log = "name =" + name + " value =" + value; } System.out.println("========WechatControllertets========= "); String signature = request.getParameter("signature");/// 微信加密签名 String timestamp = request.getParameter("timestamp");/// 时间戳 String nonce = request.getParameter("nonce"); /// 随机数 String echostr = request.getParameter("echostr"); // 随机字符串 PrintWriter out = response.getWriter(); if (SignUtil.checkSignature(signature, timestamp, nonce)) { System.out.println("校验成功!!!!!!!!!!!!!"); out.print(echostr); } out.close(); out = null; } }
2、token校验方法
package com.uvksoft.common.util.wx; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; /** * 请求校验工具类 * * @author HXM * @date 2019-07-6 */ public class SignUtil { // 与接口配置信息中的Token要一致 private static String token = "weixinCore"; /** * 验证签名 * * @param signature * @param timestamp * @param nonce * @return */ public static boolean checkSignature(String signature, String timestamp, String nonce) { String[] arr = new String[] { token, timestamp, nonce }; // 将token、timestamp、nonce三个参数进行字典序排序 Arrays.sort(arr); StringBuilder content = new StringBuilder(); for (int i = 0; i < arr.length; i++) { content.append(arr[i]); } MessageDigest md = null; String tmpStr = null; try { md = MessageDigest.getInstance("SHA-1"); // 将三个参数字符串拼接成一个字符串进行sha1加密 byte[] digest = md.digest(content.toString().getBytes()); tmpStr = byteToStr(digest); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } content = null; // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信 return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : 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; } }
-
微信测试公众号基本配置URL和Token的验证-JAVA
2018-02-12 10:57:55微信测试公众号基本配置URL和Token的验证-JAVA一、解释为什么要这样配置?
我们填写的URL和Token,微信那边会根据你填的来验证是否正确,URL必须有域名的,Token自己定义的。
微信调用我们服务器,会通过GET请求,请求带有signature、timestamp、nonce、echostr参数。服务端返回echostr参数,则表示token验证成功。
二、直接上代码
@GET @Path("/tokenVarify") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) @ApiOperation(value = "Vatify wc token", position = 1) public void tokenVarify(@Context HttpServletRequest request, @Context HttpServletResponse response) { boolean isGet = request.getMethod().toLowerCase().equals("get"); PrintWriter print; if (isGet) { // 微信加密签名 String signature = request.getParameter("signature"); // 时间戳 String timestamp = request.getParameter("timestamp"); // 随机数 String nonce = request.getParameter("nonce"); // 随机字符串 String echostr = request.getParameter("echostr"); // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败 if (signature != null && CheckoutUtil.checkSignature(signature, timestamp, nonce)) { try { print = response.getWriter(); print.write(echostr); print.flush(); } catch (IOException e) { e.printStackTrace(); } } } }
CheckoutUtil.javaimport java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class CheckoutUtil { // 与接口配置信息中的Token要一致 private static String token = "bryant.zhang.test"; /** * 验证签名 * * @param signature * @param timestamp * @param nonce * @return */ public static boolean checkSignature(String signature, String timestamp, String nonce) { String[] arr = new String[] { token, timestamp, nonce }; // 将token、timestamp、nonce三个参数进行字典序排序 // Arrays.sort(arr); sort(arr); StringBuilder content = new StringBuilder(); for (int i = 0; i < arr.length; i++) { content.append(arr[i]); } MessageDigest md = null; String tmpStr = null; try { md = MessageDigest.getInstance("SHA-1"); // 将三个参数字符串拼接成一个字符串进行sha1加密 byte[] digest = md.digest(content.toString().getBytes()); tmpStr = byteToStr(digest); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } content = null; // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信 return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : 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; } public static void sort(String a[]) { for (int i = 0; i < a.length - 1; i++) { for (int j = i + 1; j < a.length; j++) { if (a[j].compareTo(a[i]) < 0) { String temp = a[i]; a[i] = a[j]; a[j] = temp; } } } } }
-
微信测试号的URL和Token原理
2015-10-31 19:06:56在我们提交URL和Token信息后,微信服务器将发送GET请求到填写的URL上,GET请求携带四个参数: Signature(微信加密签名)、timestamp(时间戳)、nonce(随机数)、echostr(随机字符串)。 Signature 结合了开发者... -
微信公众平台测试号的url和token原理
2017-03-28 12:01:221.在微信开发平台测试号后台填写的url和token 2.点击保存的时候微信服务器会自动发一个get请求到我们写的url上面! 我们要根据我们写的token做 签名验证 3.如果签名验证成功的话!把微信发给我们的随机字符串再... -
token放在那里 url_微信公众开发URL和token填写详解
2021-01-30 11:09:49将define("TOKEN", "weixin")这句话中的weixin改成你自己的token,例如zijidetoken;然后点击右上角的全部保存。/*** wechat php test*///define your tokendefine("TOKEN", "weixin");$wechatObj = new ... -
【转】微信公众开发URL和token填写详解
2017-04-28 13:35:00很多人不明白微信公众号开发者中心服务器配置里面的url和token是什么,不会填写。看了教程也不理解是什么,本文详述一下这个问题。 第一步:作为一名微信公众号开发者,别人进入你的微信公众号,肯定会看见某些网页... -
PHP 模拟登陆微信公众平台,一键绑定URL和TOKEN的思路
2014-03-22 17:14:17PHP 模拟登陆微信公众平台,一键绑定URL和TOKEN的功能 代码就不贴出来了,把思路记录一下吧。...②设置服务器配置(用于接收用户信息)那里,post提交URL和TOKEN; ③关闭编辑模式,打开开发模式; -
php微信测试token,微信开发之微信测试帐号如何设置URL和Token,以及相关验证的原理...
2021-04-09 11:10:28本文将带你了解微信开发微信测试帐号如何设置URL和Token,以及相关验证的原理,希望本文对大家学微信有所帮助。首先说明,本帮助文档是利用javaweb的Servlet来进行“接口配置信息配置信息”认证的。在学习微信公众号... -
微信测试号,微信公众号开发中token验证的解决办法,即接口配置信息中的url和token怎么设置的方法
2018-08-03 11:42:42首先我们来看两张图,第一张是微信公众号中设置的图 第二张是测试号中的图片,之...现在讲讲接口配置信息里面的url和token到底填啥 微信需要一个请求一个URL来响应token验证,也就是你点击确定的时候是向你指定... -
微信公众平台申请测试接口URL和TOKEN的配置,怎么在本地让微信能通过80端口访问
2019-01-08 13:11:00微信公众平台申请测试接口URL和TOKEN的配置,怎么在本地让微信能通过80端口访问 -
ngrok+springboot配置微信测试号url和token
2020-10-16 17:34:501.双击ngrok输入一下两个命名 ...2.URL配置https://www.ngrok.io/wx/userAccount/getCode 和 token 3.java代码如下 private static String token = "legalminer"; @RequestMapping(value = "/getCode", meth... -
微信公众号测试号url和token绑定失败解决问题
2019-07-19 14:44:15token: 微信测试号的token # 域名配置 base: host: 你设置的url controller写上 @Value("${wx.appid}") private String appId; @Value("${wx.secret}") private String secret; @Value("${wx.token}... -
微信公众平台设置URL和Token接收接口事件推送
2019-10-05 22:43:55最近做对接微信闪开发票-微信发票名片,里面有个接收用户提交抬头接口是微信推送事件到公众号后台,该事件将发送至开发者填写的URL(登录公众平台进入【开发者中心设置】)。 开发者可通过事件推送完成数据统计、... -
微信开发者模式教程URL和Token(令牌)
2017-04-12 21:37:00使用pcwap程序可以跟微信相同,成为开发者模式,然后通过PCWAP程序后台可以配置关键词回复(文本和站内内容),关注时回复(文本和站内内容),生成自定义菜单(服务号和认证过的订阅号可用); 成为微信开者模式...