2017-03-31 15:01:11 sunhuwh 阅读数 12537
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27754 人正在学习 去看看 秦子恒

配置位置
进入公众号:https://mp.weixin.qq.com
进入开发者工具:公众号页面左下角
进入公众平台测试账号:开发者工具页面中

下面有张图片,介绍配置:
这里写图片描述

下面来看看Token验证。注意:本次微信开发专栏,全部使用spring boot进行开发。
CODE:servlet

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.shw.vote.web.service.AuthService;

public class ServerPortal extends HttpServlet {
    private static final long serialVersionUID = 1L;
    //我们的Token
    private static final String token = "tokensh";

    /**
     * @see HttpServlet#HttpServlet()
     */
    public ServerPortal() {
        super();
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String signature = request.getParameter("signature");
        String timestamp = request.getParameter("timestamp");
        String nonce = request.getParameter("nonce");
        String echostr = request.getParameter("echostr");
        System.out.println("signature:" + signature);
        System.out.println("timestamp:" + timestamp);
        System.out.println("nonce:" + nonce);
        System.out.println("echostr:" + echostr);
        PrintWriter pw = response.getWriter();
        pw.append(echostr);
        pw.flush();
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

spring boot需要注入servlet:

@Bean  
public ServletRegistrationBean testServletRegistration() {  
    ServletRegistrationBean registration = new ServletRegistrationBean(new ServerPortal());  
    //我们的URL
    registration.addUrlMappings("/portal");  
    return registration;  
}

上面我们设定Token为tokensh:
private static final String token = “tokensh”;

由于Token验证接口URL必须是域名,我这边使用了ngrok来处理域名的问题:
参考http://www.qydev.com/
注意,Token验证的地址一定要用80端口。
假设我们的域名为https://sunhush.tunnel.qydev.com
URL处我们填:https://sunhush.tunnel.qydev.com/portal

Token , URL都设定了,提交,提示提交成功,则配置完毕。

参考资料:http://www.cnblogs.com/janken/p/5593737.html

2014-05-28 10:58:34 ljz0898 阅读数 25286
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27754 人正在学习 去看看 秦子恒

配置URL的时候老提示失败,如下图:





解决的办法是:由于我的WSServlet的doGet()方法里面没有返回微信请求的随机字符串 ,在doGet里面添加如下代码 就可以


              // 微信加密签名  
       String signature = request.getParameter("signature");  
       // 时间戳  
       String timestamp = request.getParameter("timestamp");  
       // 随机数  
       String nonce = request.getParameter("nonce");  
       // 随机字符串  
       String echostr = request.getParameter("echostr");  
 
       PrintWriter out = response.getWriter();  
       out.print(echostr);



2017-11-19 16:38:27 tianyaxuezi_T 阅读数 3045
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27754 人正在学习 去看看 秦子恒
作为一个用c#开发微信公众号的初学者,在测试接口配置界面就被难住了,总是配置失败。我用的ngrok部署的,在ngrok.exe中能看到微信中的url是访问ok的,但配置仍失败。根据张思凯《微信公众平台开发与案例分析》中介绍,自己理解的需要有微信api类库,和web应用程序,我悟性低当时理解不完整。我个人觉得他这本书适合有点基础的人看,他的新手指南中微信接入示例看不懂。后来在csdn上下载了几个案例,怎么配置总是失败。不能每个案例都是错的啊,我不死心的调试。最后发现自己错在对asp不熟悉,每次使用案例前都改了token值(以为要改了才能配置),导致配置失败。如果有跟我一样初学的菜菜鸟,我的经验告诉你不要改原有案例的值,哪怕案例中写的“token值”等,就用原来的值,先测试通了再修改。
2018-09-28 18:56:21 qq_15071263 阅读数 2801
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27754 人正在学习 去看看 秦子恒

微信测试账户的申请,以及配置失败问题的处理,最新

1、开启测试号

1、登录微信公众平台
2、在开发栏目下点击开发者工具
3、点击公众平台测试账号

2、设置接口配置信息

1、设置URL
URL 需要你在项目中写一个接口,让微信来验证你的服务是可用的
注意点:你必须返回 echostr,微信才能算你验证通过,另外,你做内网穿透时最好Tomcat 使用80端口,可以降低3倍的延迟,因为延迟太高微信也会一直配置失败,还有一个,在一定的时间内,如果失败次数过多,就稍微等半个小时再来试,因为失败次数过多,微信那边会暂时性的把你配置的域名拉入黑名单,不再回调你的接口。不要死磕、

    @RequestMapping(value = "/wx", produces = {"application/json;charset=utf-8"})
    public String wx(HttpServletRequest request, String echostr) {
        System.out.println("微信来了");
        return echostr;
    }

2、Token
随便填就好了。

3、设置JS接口安全域名

1、把你的外网映射域名填写上去就好了

4、设置网页授权域名

1、把你的外网映射域名填写上去就好了,不填授权不能回调

2016-03-14 22:19:54 u013239111 阅读数 1725
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27754 人正在学习 去看看 秦子恒

微信中的填写服务器配置完成后就进入验证服务器地址的有效性,也就是微信接入验证。公众平台测试账号中只需配置下图中的两项即可。
这里写图片描述
当你点击提交信息时微信就验证你所填写的服务器地址的有效性,验证成功是会出现配置成功字样,失败则出现配置失败。如下如所示
这里写图片描述
这里写图片描述


接下来我们来看看微信公众平台开发者文档
这里写图片描述
从上图可以看出使用GET请求来访问我们提供给微信公众平台的URL,并且携带了四个参数。这是我们可以写一个如下方法
这里写图片描述
接着我们需要获取微信给我们发送的四个参数,对于springmvc来说有多种方式来接受这些参数,这边列出一些

  1. 第一种
    这里写图片描述
  2. 第二种
    这里写图片描述
  3. 第三种
    这里写图片描述
    这里写图片描述

本人是采用第三种方式,在coreByGet方法中加入一个包含微信提供给我们四个参数的bean,这样微信GET请求时的参数全部会注入到这个bean中,而Base这个bean中包含接口配置信息的Token。
这里写图片描述


接收参数的问题已经解决,那么我们来看看接下来需要做什么
这里写图片描述
接下来看看加密/校验流程
这里写图片描述
具体流程可以参照下图
这里写图片描述


首先是字典序排序,java中比较简单sort方法一下就好了,代码参照如下

String[] strs = new String[] { validation.getToken(), validation.getNonce(), validation.getTimestamp() };
            Arrays.sort(strs);

然后拼接成一个字符串

StringBuilder appendStr = new StringBuilder();
for (int i = 0; i < strs.length; i++) {
    appendStr.append(strs[i]);
}

接着sha1加密

StringBuffer signature = new StringBuffer();
            MessageDigest digest = MessageDigest.getInstance("SHA-1");
            byte[] bytes = digest.digest(appendStr.toString().getBytes());

            // 字节数组转换为十六进制数
            for (int i = 0; i < bytes.length; i++) {
                String shaHex = Integer.toHexString(bytes[i] & 0xFF);
                if (shaHex.length() < 2) {
                    signature.append(0);
                }
                signature.append(shaHex);
            }

最后与微信通过GET发送过来的signature进行比较,一样这原样返回echostr字符串,否则可以什么都不做

全部代码如下

  • CoreAccess

@Controller
public class CoreAccess {

    private static Logger logger = LoggerFactory.getLogger(CoreAccess.class);

    @ResponseBody
    @RequestMapping(value = "/core", method = RequestMethod.GET)
    public String coreByGet(FirstValidation validation, Model model, HttpServletRequest request) {

        logger.info("微信开始验证服务器地址的有效性..........................");

        // 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
        if (checkSignatureIsTrue(validation)) {
            logger.info("加密后的字符串与Signature一致,接入成功......................");
            return validation.getEchostr();
        } else {
            logger.info("加密后的字符串与Signature不一致,接入失败......................");
            logger.info("访问者IP:" + HttpUtils.getIpAddr(request));
            return "";
        }
    }

    @RequestMapping(value = "/core", method = RequestMethod.POST)
    public String coreByPost(Model model) {
        return "";
    }

    /**
     * Mar 14, 2016 6:27:19 PM
     * 
     * @param validation
     * @return 加密后的字符串
     * @Description: 加密/校验流程如下:
     */
    private static boolean checkSignatureIsTrue(FirstValidation validation) {
        boolean flag = false;
        try {
            // 1. 将token、timestamp、nonce三个参数进行字典序排序
            String[] strs = new String[] { validation.getToken(), validation.getNonce(), validation.getTimestamp() };
            Arrays.sort(strs);

            // 2. 将三个参数字符串拼接成一个字符串进行sha1加密
            StringBuilder appendStr = new StringBuilder();
            for (int i = 0; i < strs.length; i++) {
                appendStr.append(strs[i]);
            }

            StringBuffer signature = new StringBuffer();
            MessageDigest digest = MessageDigest.getInstance("SHA-1");
            byte[] bytes = digest.digest(appendStr.toString().getBytes());

            // 字节数组转换为十六进制数
            for (int i = 0; i < bytes.length; i++) {
                String shaHex = Integer.toHexString(bytes[i] & 0xFF);
                if (shaHex.length() < 2) {
                    signature.append(0);
                }
                signature.append(shaHex);
            }

            if (validation.getSignature().equals(signature.toString())) {
                flag = true;
            }

        } catch (Exception e) {
            logger.error("验证服务器地址的有效性时加密出现错误");

        }
        return flag;
    }
}
  • FirstValidation

public class FirstValidation extends Base{
    private String signature;// 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。

    private String timestamp;// 时间戳

    private String nonce;// 随机数

    private String echostr;// 随机字符串

    public String getSignature() {
        return signature;
    }

    public void setSignature(String signature) {
        this.signature = signature;
    }

    public String getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(String timestamp) {
        this.timestamp = timestamp;
    }

    public String getNonce() {
        return nonce;
    }

    public void setNonce(String nonce) {
        this.nonce = nonce;
    }

    public String getEchostr() {
        return echostr;
    }

    public void setEchostr(String echostr) {
        this.echostr = echostr;
    }



}
  • Base

public class Base {

    private String token = "HuangzhaoDong";

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }


}
没有更多推荐了,返回首页