精华内容
下载资源
问答
  • 获取资源的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填写详解

    很多人不明白微信公众号开发者中心服务器配置里面的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验证,官方文档有介绍,不再赘述,上代码;

    1. package com.WeChat.verify;
    2. import java.io.IOException;
    3. import java.io.PrintWriter;
    4. import javax.servlet.ServletException;
    5. import javax.servlet.annotation.WebServlet;
    6. import javax.servlet.http.HttpServlet;
    7. import javax.servlet.http.HttpServletRequest;
    8. import javax.servlet.http.HttpServletResponse;
    9. @WebServlet("/wx")
    10. public class WeixinServlet extends HttpServlet {
    11. @Override
    12. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    13. throws ServletException, IOException {
    14. String signature = req.getParameter("signature");// 微信加密签名
    15. String timestamp = req.getParameter("timestamp");// 时间戳
    16. String nonce = req.getParameter("nonce");// 随机数
    17. String echostr = req.getParameter("echostr");// 随机字符串
    18. PrintWriter out = resp.getWriter();
    19. if(CheckUtil.checkSignature(signature, timestamp, nonce)){
    20. out.print(echostr);
    21. }
    22. }
    23. /
    24. * 消息的接收与响应
    25. /
    26. @Override
    27. protected void doPost(HttpServletRequest req, HttpServletResponse resp){
    28. }
    29. }

    校验签名

    1. package com.WeChat.verify;
    2. import java.security.MessageDigest;
    3. import java.security.NoSuchAlgorithmException;
    4. import java.util.Arrays;
    5. public class CheckUtil {
    6. // 与接口配置信息中的Token要一致
    7. private static String token = "Token";
    8. /
    9. 校验签名
    10. /
    11. public static boolean checkSignature(String signature, String timestamp, String nonce) {
    12. System.out.println("signature:" + signature + "timestamp:" + timestamp + "nonc:" + nonce);
    13. String[] arr = new String[] { token, timestamp, nonce };
    14. // 将token、timestamp、nonce三个参数进行字典序排序
    15. Arrays.sort(arr);
    16. StringBuilder content = new StringBuilder();
    17. for (int i = 0; i < arr.length; i++) {
    18. content.append(arr[i]);
    19. }
    20. MessageDigest md = null;
    21. String tmpStr = null;
    22. try {
    23. md = MessageDigest.getInstance("SHA-1");
    24. // 将三个参数字符串拼接成一个字符串进行sha1加密
    25. byte[] digest = md.digest(content.toString().getBytes());
    26. tmpStr = byteToStr(digest);
    27. } catch (NoSuchAlgorithmException e) {
    28. e.printStackTrace();
    29. }
    30. content = null;
    31. // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
    32. System.out.println(tmpStr.equals(signature.toUpperCase()));
    33. return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
    34. }
    35. /
    36. 将字节数组转换为十六进制字符串
    37. *
    38. * @param byteArray
    39. * @return
    40. /
    41. private static String byteToStr(byte[] byteArray) {
    42. String strDigest = "";
    43. for (int i = 0; i < byteArray.length; i++) {
    44. strDigest += byteToHexStr(byteArray[i]);
    45. }
    46. return strDigest;
    47. }
    48. /
    49. 将字节转换为十六进制字符串
    50. *
    51. * @param mByte
    52. * @return
    53. /
    54. private static String byteToHexStr(byte mByte) {
    55. char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
    56. char[] tempArr = new char[2];
    57. tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
    58. tempArr[1] = Digit[mByte & 0X0F];
    59. String s = new String(tempArr);
    60. return s;
    61. }
    62. }

    至此,微信和我们的服务器,能沟通了偷笑,我们继续,,,

    由于我们启动时需要加载微信的accessToken,和JSAPI接口的飞机票,JSApiTicket,下面配置web.xml

    1. <servlet-name>InitAccessTokenServlet</servlet-name>
    2. <servlet-class>com.oa.wx.utils.InitAccessTokenServlet</servlet-class>
    3. <init-param>
    4. <param-name>appid</param-name>
    5. <param-value>wx4fb90asd5015e9820</param-value>
    6. </init-param>
    7. <init-param>
    8. <param-name>appsecret</param-name>
    9. <param-value>f7850725c4fff0423349c2a62e2d430</param-value>
    10. </init-param>
    11. <load-on-startup>2</load-on-startup>
    12. </servlet>

    上面配置的目的就是当项目启动时加载 InitAccessTokenServlet 获取我们想要的信息;

    为了方便我们建立两个实体类用于获取参数 ,同时准备一些类供加载时调用:

    1. package com.oa.wx.utils;
    2. public class AccessToken implements java.io.Serializable {
    3. /
    4. /
    5. private static final long serialVersionUID = 1L;
    6. // 接口访问凭证
    7. private String accessToken;
    8. // 凭证有效期,单位:秒
    9. private int expiresIn;
    10. public AccessToken() {
    11. }
    12. public String getAccessToken() {
    13. return accessToken;
    14. }
    15. public void setAccessToken(String accessToken) {
    16. this.accessToken = accessToken;
    17. }
    18. public int getExpiresIn() {
    19. return expiresIn;
    20. }
    21. public void setExpiresIn(int expiresIn) {
    22. this.expiresIn = expiresIn;
    23. }
    24. }
    25. package com.oa.wx.utils;
    26. public class JsApiTicket implements java.io.Serializable {
    27. /
    28. /
    29. private static final long serialVersionUID = 1L;
    30. private String ticket;
    31. // 凭证有效期,单位:秒
    32. private int expiresIn;
    33. public JsApiTicket() {
    34. }
    35. public String getTicket() {
    36. return ticket;
    37. }
    38. public void setTicket(String ticket) {
    39. this.ticket = ticket;
    40. }
    41. public int getExpiresIn() {
    42. return expiresIn;
    43. }
    44. public void setExpiresIn(int expiresIn) {
    45. this.expiresIn = expiresIn;
    46. }
    47. }

    开通了一个https协议,但是不是国际认证的,自己做的证书,访问一个接口的时候比如 https:/xx.xx.xx.xx/a?c=d的时候,如果在游览器访问,需要用户确认的。如果我要模拟服务器向这个接口发送请求,就会报错误。
    我的原代码是:

    1 创建信任管理器

    1. /*
    2. * 信任管理器
    3. *
    4. * @date 2013-04-10
    5. /
    6. public class MyX509TrustManager implements X509TrustManager {
    7. // 检查客户端证书
    8. public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    9. }
    10. // 检查服务器端证书
    11. public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    12. }
    13. // 返回受信任的X509证书数组
    14. public X509Certificate[] getAcceptedIssuers() {
    15. return null;
    16. }
    17. }

    编写获取accessToken 和飞机票的接口,在网上找了个例子,编写了个工具类如下、

    1. package com.oa.wx.utils;
    2. import java.io.BufferedReader;
    3. import java.io.InputStream;
    4. import java.io.InputStreamReader;
    5. import java.io.OutputStream;
    6. import java.io.UnsupportedEncodingException;
    7. import java.net.URL;
    8. import java.security.MessageDigest;
    9. import java.security.NoSuchAlgorithmException;
    10. import java.util.Arrays;
    11. import java.util.Formatter;
    12. import java.util.HashMap;
    13. import java.util.Map;
    14. import java.util.UUID;
    15. import javax.net.ssl.HttpsURLConnection;
    16. import javax.net.ssl.SSLContext;
    17. import javax.net.ssl.SSLSocketFactory;
    18. import javax.net.ssl.TrustManager;
    19. import com.fasterxml.jackson.databind.JsonNode;
    20. import com.fasterxml.jackson.databind.ObjectMapper;
    21. public class WeiXinUtil {
    22. // 凭证获取(GET)——access_token
    23. public final static String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
    24. // 微信JSSDK的ticket请求URL地址——jsapi_ticket
    25. public final static String JSAPI_TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
    26. //微信APPID
    27. public final static String APP_ID="wx4fb9062502315e9820";
    28. //微信APPSECRET
    29. public final static String APPSECRET="19751e4ebd34c56e763f28b1a8c8263053";
    30. /*
    31. * 排序方法
    32. *
    33. * @param token
    34. * @param timestamp
    35. * @param nonce
    36. * @return
    37. /
    38. public static String sort(String token, String timestamp, String nonce) {
    39. String[] strArray = { token, timestamp, nonce };
    40. Arrays.sort(strArray);
    41. StringBuilder sbuilder = new StringBuilder();
    42. for (String str : strArray) {
    43. sbuilder.append(str);
    44. }
    45. return sbuilder.toString();
    46. }
    47. /*
    48. * 发送https请求
    49. *
    50. * @param requestUrl
    51. * 请求地址
    52. * @param requestMethod
    53. * 请求方式(GET、POST)
    54. * @param outputStr
    55. * 提交的数据
    56. * @return rootNode(通过rootNode.get(key)的方式获取json对象的属性值)
    57. /
    58. public static JsonNode httpsRequest(String requestUrl, String requestMethod, String outputStr) {
    59. ObjectMapper mapper = new ObjectMapper();
    60. JsonNode rootNode = null;
    61. StringBuffer buffer = new StringBuffer();
    62. try {
    63. // 创建SSLContext对象,并使用我们指定的信任管理器初始化
    64. TrustManager[] tm = { new MyX509TrustManager() };
    65. SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
    66. sslContext.init(null, tm, new java.security.SecureRandom());
    67. // 从上述SSLContext对象中得到SSLSocketFactory对象
    68. SSLSocketFactory ssf = sslContext.getSocketFactory();
    69. URL url = new URL(requestUrl);
    70. HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
    71. conn.setSSLSocketFactory(ssf);
    72. conn.setDoOutput(true);
    73. conn.setDoInput(true);
    74. conn.setUseCaches(false);
    75. // 设置请求方式(GET/POST)
    76. conn.setRequestMethod(requestMethod);
    77. //conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    78. if ("GET".equalsIgnoreCase(requestMethod))
    79. conn.connect();
    80. // 当outputStr不为null时向输出流写数据
    81. if (null != outputStr) {
    82. OutputStream outputStream = conn.getOutputStream();
    83. // 注意编码格式
    84. outputStream.write(outputStr.getBytes("UTF-8"));
    85. outputStream.close();
    86. }
    87. // 从输入流读取返回内容
    88. InputStream inputStream = conn.getInputStream();
    89. InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
    90. BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
    91. String str = null;
    92. while ((str = bufferedReader.readLine()) != null) {
    93. buffer.append(str);
    94. }
    95. // 释放资源
    96. bufferedReader.close();
    97. inputStreamReader.close();
    98. inputStream.close();
    99. inputStream = null;
    100. conn.disconnect();
    101. rootNode = mapper.readTree(buffer.toString());
    102. } catch (Exception e) {
    103. e.printStackTrace();
    104. }
    105. return rootNode;
    106. }
    107. /*
    108. * 获取接口访问凭证
    109. *
    110. * @param appid
    111. * 凭证
    112. * @param appsecret
    113. * 密钥
    114. * @return
    115. /
    116. public static AccessToken getAccessToken() {
    117. AccessToken accessToken = null;
    118. String requestUrl = ACCESS_TOKEN_URL.replace("APPID", APP_ID).replace("APPSECRET", APPSECRET);
    119. // 发起GET请求获取凭证
    120. JsonNode rootNode = httpsRequest(requestUrl, "GET", null);
    121. System.out.println("rootNoderootNoderootNode"+rootNode);
    122. if (null != rootNode.get("access_token")) {
    123. accessToken = new AccessToken();
    124. accessToken.setAccessToken(rootNode.get("access_token").textValue());
    125. accessToken.setExpiresIn(toInt(rootNode.get("expires_in").toString()));
    126. }
    127. return accessToken;
    128. }
    129. /*
    130. * 调用微信JS接口的临时票据
    131. *
    132. * @param access_token
    133. * 接口访问凭证
    134. * @return
    135. /
    136. public static JsApiTicket getJsApiTicket(String access_token) {
    137. String requestUrl = JSAPI_TICKET_URL.replace("ACCESS_TOKEN", access_token);
    138. // 发起GET请求获取凭证
    139. JsonNode rootNode = httpsRequest(requestUrl, "GET", null);
    140. System.out.println(rootNode.toString());
    141. JsApiTicket jsApiTicket = null;
    142. if (null != rootNode.get("ticket")) {
    143. jsApiTicket = new JsApiTicket();
    144. jsApiTicket.setTicket(rootNode.get("ticket").textValue());
    145. jsApiTicket.setExpiresIn(toInt(rootNode.get("expires_in").toString()));
    146. }
    147. return jsApiTicket;
    148. }
    149. public static Integer toInt(String str) {
    150. if (str == null || str.equals("")) {
    151. return null;
    152. }
    153. return Integer.valueOf(str);
    154. }
    155. /*
    156. * 获取接口访问凭证
    157. *
    158. * @param appid
    159. * 凭证
    160. * @param appsecret
    161. * 密钥
    162. * @return
    163. /
    164. public static String getAuthorize(String url) {
    165. AccessToken accessToken = null;
    166. String requestUrl = ACCESS_TOKEN_URL.replace("APPID", APP_ID).replace("APPURL", url);
    167. // 发起GET请求获取凭证
    168. JsonNode rootNode = httpsRequest(requestUrl, "GET", null);
    169. System.out.println(rootNode.toString());
    170. return rootNode.toString();
    171. }
    172. public static String create_nonce_str() {
    173. return UUID.randomUUID().toString();
    174. }
    175. public static String create_timestamp() {
    176. return Long.toString(System.currentTimeMillis() / 1000);
    177. }
    178. public static String byteToHex(final byte[] hash) {
    179. Formatter formatter = new Formatter();
    180. for (byte b : hash) {
    181. formatter.format("%02x", b);
    182. }
    183. String result = formatter.toString();
    184. formatter.close();
    185. return result;
    186. }
    187. public static Map<String, String> sign(String jsapi_ticket, String url) {
    188. Map<String, String> ret = new HashMap<String, String>();
    189. String nonce_str = WeiXinUtil.create_nonce_str();
    190. String timestamp = WeiXinUtil.create_timestamp();
    191. String string1;
    192. String signature = "";
    193. // 注意这里参数名必须全部小写,且必须有序
    194. string1 = "jsapi_ticket=" + jsapi_ticket +
    195. "&noncestr=" + nonce_str +
    196. "×tamp=" + timestamp +
    197. "&url=" + url;
    198. System.out.println(string1);
    199. try {
    200. MessageDigest crypt = MessageDigest.getInstance("SHA-1");
    201. crypt.reset();
    202. crypt.update(string1.getBytes("UTF-8"));
    203. signature = WeiXinUtil.byteToHex(crypt.digest());
    204. } catch (NoSuchAlgorithmException e) {
    205. e.printStackTrace();
    206. } catch (UnsupportedEncodingException e) {
    207. e.printStackTrace();
    208. }
    209. ret.put("url", url);
    210. ret.put("appId",WeiXinUtil.APP_ID);
    211. ret.put("jsapi_ticket", jsapi_ticket);
    212. ret.put("nonceStr", nonce_str);
    213. ret.put("timestamp", timestamp);
    214. ret.put("signature", signature);
    215. return ret;
    216. }
    217. }

    access_token与jsapi_ticket 需要全局缓存为什么我就不说了,既然来看了就应该知道了

    我用的是spring容器加载完毕后监听器,就是容器加载完毕调用 ApplicationListener

    这样可以获取access_token jsapi_ticket 缓存到servletcontext中(servletcontext全局容易 全局唯一 全局共享)

    首先看一下全局servletcontext;

    1. package com.oa.wx.utils;
    2. import javax.servlet.ServletContext;
    3. import org.springframework.web.context.ContextLoader;
    4. import org.springframework.web.context.WebApplicationContext;
    5. /
    6. @ClassName: ServletContextUtil
    7. * @author yangwl
    8. * @date 2016年5月11日 下午4:54:16
    9. * @Description:
    10. * 全局缓存servletcontext
    11. /
    12. public final class ServletContextUtil {
    13. private static ServletContext serveltContext = null;
    14. private ServletContextUtil(){};
    15. public synchronized static ServletContext get() {
    16. if(null == serveltContext) {
    17. WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
    18. serveltContext = webApplicationContext.getServletContext();
    19. }
    20. return serveltContext;
    21. }
    22. }

    由于微信的一些情况 accessToken 每天的获取数量是有限的,所以需要做缓存处理,在这里写了两个线程,一个是获取 accessToken ,一个是JsApiTicket;

    1. package com.oa.wx.utils;
    2. import javax.servlet.ServletContext;
    3. public class AccessTokenThread implements Runnable {
    4. public static String appid = "";
    5. public static String appsecret = "";
    6. public static AccessToken accessToken = null;
    7. @Override
    8. public void run() {
    9. while (true) {
    10. try {
    11. accessToken = WeiXinUtil.getAccessToken();
    12. if (null != accessToken) {
    13. System.out.println("accessToken初始化成功:" + accessToken.getAccessToken());
    14. // 全局缓存access_token
    15. ServletContext servletContext = ServletContextUtil.getServletContext();
    16. servletContext.setAttribute("access_token", accessToken.getAccessToken());
    17. // 有效期(秒)减去200秒,乘以1000(毫秒)——也就是在有效期的200秒前去请求新的accessToken
    18. Thread.sleep((accessToken.getExpiresIn() - 200) 1000);
    19. } else {
    20. // 等待一分钟,再次请求
    21. Thread.sleep(60 1000);
    22. }
    23. } catch (Exception e) {
    24. try {
    25. // 等待一分钟,再次请求
    26. Thread.sleep(60 1000);
    27. } catch (Exception ex) {
    28. ex.printStackTrace();
    29. }
    30. e.printStackTrace();
    31. }
    32. }
    33. }
    34. }
    35. package com.oa.wx.utils;
    36. import javax.servlet.ServletContext;
    37. public class JsApiTicketThread implements Runnable {
    38. @Override
    39. public void run() {
    40. while (true) {
    41. try {
    42. ServletContext servletContext = ServletContextUtil.getServletContext();
    43. String access_token = (String) servletContext.getAttribute("access_token");
    44. JsApiTicket jsApiTicket = null;
    45. if(null != access_token && !"".equals(access_token)){
    46. // 获取jsapi_ticket
    47. jsApiTicket = WeiXinUtil.getJsApiTicket(access_token);
    48. if (null != jsApiTicket) {
    49. System.out.println("jsapi_ticket获取成功:" + jsApiTicket.getTicket());
    50. // 全局缓存jsapi_ticket
    51. servletContext.setAttribute("jsapi_ticket", jsApiTicket.getTicket());
    52. Thread.sleep((jsApiTicket.getExpiresIn() - 200) 1000);
    53. }
    54. }
    55. Thread.sleep(60 1000);
    56. } catch (Exception e) {
    57. try {
    58. Thread.sleep(60 1000);
    59. } catch (Exception ex) {
    60. ex.printStackTrace();
    61. }
    62. e.printStackTrace();
    63. }
    64. }
    65. }
    66. }

    最后我们编写 InitAccessTokenServlet ,首次加载时调用;

    1. package com.oa.wx.utils;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.http.HttpServlet;
    4. public class InitAccessTokenServlet extends HttpServlet {
    5. /
    6. */
    7. private static final long serialVersionUID = 1L;
    8. public void init() throws ServletException {
    9. // 获取web.xml中配置的参数
    10. String WX_APPID ="wx4fb90625015e9820";
    11. String WX_APPSECRET = "19751e4ebdc56e763f28b1a8c8263053";
    12. AccessTokenThread.appid = WX_APPID;
    13. AccessTokenThread.appsecret = WX_APPSECRET;
    14. if ("".equals(AccessTokenThread.appid) || "".equals(AccessTokenThread.appsecret)) {
    15. System.out.println("appid和appsecret未给出");
    16. } else {
    17. new Thread(new AccessTokenThread()).start();
    18. new Thread(new JsApiTicketThread()).start();
    19. }
    20. }
    21. }

    至此,微信服务端配置环境已结束,以上代码均在网上整理,为查阅方便整理到一起,如有侵权行为请与我联系。以上代码仅供参考,如遇问题可以留言!

    展开全文
  • 1、因为再微信公众号开发关键字回复的时候需要使用到接口配置信息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


    一、解释为什么要这样配置?

    我们填写的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.java

    import 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:22
    1.在微信开发平台测试号后台填写的url和token 2.点击保存的时候微信服务器会自动发一个get请求到我们写的url上面! 我们要根据我们写的token做 签名验证 3.如果签名验证成功的话!把微信发给我们的随机字符串再...
  • 将define("TOKEN", "weixin")这句话中的weixin改成你自己的token,例如zijidetoken;然后点击右上角的全部保存。/*** wechat php test*///define your tokendefine("TOKEN", "weixin");$wechatObj = new ...
  • 很多人不明白微信公众号开发者中心服务器配置里面的url和token是什么,不会填写。看了教程也不理解是什么,本文详述一下这个问题。 第一步:作为一名微信公众号开发者,别人进入你的微信公众号,肯定会看见某些网页...
  • PHP 模拟登陆微信公众平台,一键绑定URL和TOKEN的功能 代码就不贴出来了,把思路记录一下吧。...②设置服务器配置(用于接收用户信息)那里,post提交URL和TOKEN; ③关闭编辑模式,打开开发模式;
  • 本文将带你了解微信开发微信测试帐号如何设置URL和Token,以及相关验证的原理,希望本文对大家学微信有所帮助。首先说明,本帮助文档是利用javaweb的Servlet来进行“接口配置信息配置信息”认证的。在学习微信公众号...
  • 首先我们来看两张图,第一张是微信公众号中设置的图 第二张是测试号中的图片,之...现在讲讲接口配置信息里面的url和token到底填啥 微信需要一个请求一个URL来响应token验证,也就是你点击确定的时候是向你指定...
  • 微信公众平台申请测试接口URL和TOKEN的配置,怎么在本地让微信能通过80端口访问
  • 1.双击ngrok输入一下两个命名 ...2.URL配置https://www.ngrok.io/wx/userAccount/getCode token 3.java代码如下 private static String token = "legalminer"; @RequestMapping(value = "/getCode", meth...
  • token: 微信测试号的token # 域名配置 base: host: 你设置的url controller写上 @Value("${wx.appid}") private String appId; @Value("${wx.secret}") private String secret; @Value("${wx.token}...
  • 最近做对接微信闪开发票-微信发票名片,里面有个接收用户提交抬头接口是微信推送事件到公众号后台,该事件将发送至开发者填写的URL(登录公众平台进入【开发者中心设置】)。 开发者可通过事件推送完成数据统计、...
  • 使用pcwap程序可以跟微信相同,成为开发者模式,然后通过PCWAP程序后台可以配置关键词回复(文本站内内容),关注时回复(文本站内内容),生成自定义菜单(服务号认证过的订阅号可用); 成为微信开者模式...

空空如也

空空如也

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

url和token