2016-11-15 11:38:46 qq_24091555 阅读数 20068
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

           由于项目需要,需要接触微信开发,并要调用微信的JS-SDK里面的接口。

       因为经验缺乏,我百度一下关于微信开发的资料,但收集的资料都不尽人意。网上的主流的微信开发是采用PHP开发的,而本人学的Java。所以对PHP微信开发只能看懂思路。更有的是,网上一些微信开发视频,也是和PHP有关的,关于用Java开发的甚少。

       无奈之下,我只好苦啃微信开发文档。大家都知道,微信官方给的开发文档真的有点那个啥,一个功能实现非要分几个地方来说,看完这块,又得点击另一个页面看完另一块,甚是麻烦。这样的设定也让我走了好多坑。

但功夫不负有心,在研究透了微信开发文档之后,我顺利在在项目中完成微信开发。现在我将微信开发的经验分享一下,希望对大家有所帮助。

       微信JS-SDK是微信公众号平台面向网页开发这提供基于微信内的网页开发工具包。接口大类分为:基础接口、分享接口、图像接口、音频接口、智能接口、设备信息、地址位置、摇一摇周边、界面操作、微信扫一扫、微信小店、微信卡劵和微信支付。一般使用频率高的就是分享接口、地理微信、微信扫一扫和微信支付。

接下来,我将主要讲解如何调用微信分享接口。

第一步,准备内网映射工具,ngrok。不清楚这个的同学可以去百度一下。https://ngrok.com为ngrok官网。要进行微信开发,内网映射工具是不可少。毕竟,我们程序员进行开发,要测试开发的产品是否能用,都先在自己的电脑跑一下。但由于ngrok的服务器在外国的,鉴于天朝的墙太高,访问可能不稳定。所以我推荐的是国内的natapp,免费和收费的都有,服务毕竟稳定可靠,只不过要想自定义二级域名就得交费成为VIP咯。

第二步,配置JS接口安全域名。登录要进行开发的公众号,点击公众设置--->功能设置。设置JS接口安全域名,要注意三点:①填写域名前面不需加上http://,例如你的域名是http://test.com,直接填写test.com即可;②域名默认80端口,只支持80和443端口,所以域名后面不能添加端口号。③该域名为你调用微信JS-SDK接口域名。

第三步,引用JS文件。在需要调用JS接口的页面引入http://res.wx.qq.com/open/js/jweixin-1.0.0.js 。


第四步,通过config接口注入权限验证配置 。具体参数有什么用处,在截图都有注释讲解。其中jsApiList为我们要使用的接口,我在下面共引用了五个接口,分别为微信好友分享、QQ好友分享、腾讯微博分享、QQ空间分享和朋友圈分享。调用的都是分享的接口。至于其他接口列表,可以去微信开发文档那浏览一下。这里就不详说。

        第五步,在服务器生成相关参数传到调用JS-SDK页面,完成授权。这是最重要的一步。如上图所示,appId,timestamp,nonceStr,signature都为必填参数。下面我将会详细说说如何生成这些参数并传回页面。

appId为开发的微信公众号的AppID(应用ID),我们可以在登录微信公众号,在开发选项中点击基本配置来查看。

timestamp为系统生成的时间戳。


nonceStr为服务器随机生成的字符串。



signature为微信JS-SDK使用权限算法。在生成signature之前,我们要拿到jsapi_ticket。官方文档是这样解释的:


我们要注意三个地方。jsapi_ticket要缓存两个小时,每过两个小时,向微信那边请求一次。获取jsapi_ticket要通过access_token。那么我们该如何获取access_token呢?


从文档可以看出,access_token需要AppID和AppSercet两个参数。而且access_token和jsapi_ticket一样,有效期皆为两小时。这就要求我们服务器要缓存access_token和jsapi_ticket,当有效期一过,就重新请求。有的人采用是用数据库来存取这两个参数,而我采用的是用Quartz定时器。关于Quartz定时器的使用,可浏览我上篇博客《SSH与Quartz集成》,里面有关于Quartz的使用方法。

AppSercet可在与APPID同一页面获取。接下来,调用接口,获取access_token。



接下来,我们用access_token去获取jsapi_ticket。


获取jsapi_ticket,就可以进行生成签名。在此之前,先看一下官方文档的签名算法。



用代码实现。


第六步,传生成的参数给网页。



第七步,调用已授权的JS接口。


第八步,利用微信Web开发者工具调试,看看是否授权成功。(微信web开发者工具可在微信开发下载)。



2016-10-09 08:57:00 miaozhenzhong 阅读数 2313
  • 微信支付开发-微信公众号开发12-微信开发php

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

    27836 人正在学习 去看看 秦子恒
2015-12-13 21:57:03 yutianxin123 阅读数 1054
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

微信开发就是调用接口。这个难点就是调用接口时需要验证,必须按照微信要求的验证规则验证成功后才能调用接口。那么以我开发的微信小项目总结一下微信开发的难点。

1.微信开发属于web开发,要选合适的语言

尽管web开发有众多的语言,但是我觉得有必要提醒尽量选择主流、合适的语言。通过微信给的例子支持的语言就可以看出个一二三。PHP,jsp我觉得貌似比较主流,其他的语言也能做,可能没那么有优势吧。

2.微信接口调用验证

这个我觉得稍微有点难或者说繁,因为接口调用很好办,直接调用。而验证往往需要验证你的身份、权限各种(其实这也是微信为了安全起见、掌握控制权的体现)。解决这个问题我觉得直接阅读开发者文档最有效,文档里面也说的很明确。

3.调试技巧

如果你没有web程序的开发经验,你可能会忽视调试的作用。我曾经也想当然地回避调试,就各种看、想,硬把程序调对,后来发现web程序的调试很有技巧,如果掌握了会极大地加快开发速度。就比如我验证jssdk时,一直找不出错误。后来我运行网页,右键点击审查元素,就可以检查自己运行时的代码,进而找到了为什么验证不成功。

微信开发其实并不难,开发者文档我觉得是最好的参考资料,同时注意网络程序的安全性,以及相关网络程序开发的技巧就可以了。

2018-09-20 14:31:04 qq_16570607 阅读数 2181
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

微信公众平台开发文档

  1. 主要用到"微信网页授权"方面的api。
  2. 如果要使用静默方式获取微信用户信息可以在"微信网页授权"获取到用户openid后再使用"获取用户基本信息"api获取用户信息。

在这里插入图片描述
在这里插入图片描述

以下例子主要用到静默方式获取用户信息,即无需用户授权直接获取用户信息的方式

前台代码

  1. 引导用户打开微信端链接
  2. 由于这个项目是公众号开发,所以直接菜单引导用户打开微信端链接
  3. 下图"首页"菜单对应的链接:https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx87f4d5d049fbbcd6&redirect_uri=http%3A%2F%2Fy2182763o7.iok.la%2Fwx%2FcallBack&response_type=code&scope=snsapi_base&connect_redirect=1#wechat_redirect
  4. 链接所带参数根据个人项目而言

在这里插入图片描述

后台代码

  1. 以下controller里面的方法对应微信回调地址
  2. return “redirect:/index.html?userid=”+userid; 重定向到你项目里面要打开的页面
 @RequestMapping("/callBack")
    public String callBack(String code){
        System.out.println("code:"+code);
        String userid = "";
        CloseableHttpClient httpClient = HttpClients.createDefault();
        try {
            URIBuilder uriBuilder = new URIBuilder("https://api.weixin.qq.com/sns/oauth2/access_token");
            uriBuilder.addParameter("appid",APPID);
            uriBuilder.addParameter("secret",APPSECRET);
            uriBuilder.addParameter("code",code);
            uriBuilder.addParameter("grant_type","authorization_code");
            HttpGet get = new HttpGet(uriBuilder.build());
            //执行请求
            CloseableHttpResponse closeableHttpResponse = httpClient.execute(get);
            //取响应结果
            int statusCode = closeableHttpResponse.getStatusLine().getStatusCode();
            if (statusCode==200){
                HttpEntity entity = closeableHttpResponse.getEntity();
                try {
                    String jsonStr = EntityUtils.toString(entity,"utf-8");
                    ObjectMapper objectMapper = new ObjectMapper();
                    HashMap<String,Object> map = objectMapper.readValue(jsonStr,HashMap.class);
                    System.out.println("jsonStr:"+jsonStr);
                    if (null==map.get("errcode")){
                        String access_token = getAccessToken();
                        String openid = (String) map.get("openid");
                        JieqiUser userInfo = login(access_token,openid); //用户信息
                        userid = userInfo.getUserid();
                        closeableHttpResponse.close(); //关闭资源
                        httpClient.close(); //关闭资源
                    }
                } catch (Exception e) {
                    closeableHttpResponse.close();
                    httpClient.close();
                    return "redirect:/index.html?userid="+userid;
                }
            }
        } catch (Exception e) {
            return "redirect:/index.html?userid="+userid;
        }
        return "redirect:/index.html?userid="+userid;
    }

private JieqiUser login(String access_token,String openid){
        CloseableHttpClient httpClient = HttpClients.createDefault();
        try {
            URIBuilder uriBuilder = new URIBuilder("https://api.weixin.qq.com/cgi-bin/user/info");
            uriBuilder.addParameter("access_token",access_token);
            uriBuilder.addParameter("openid",openid);
            uriBuilder.addParameter("lang","zh_CN");
            HttpGet httpGet = new HttpGet(uriBuilder.build());
            CloseableHttpResponse response = httpClient.execute(httpGet);
            //获取响应码
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode==200) {
                String jsonStr = EntityUtils.toString(response.getEntity(), "utf-8");
                System.out.println("微信用户信息:" + jsonStr);
                ObjectMapper objectMapper = new ObjectMapper();
                HashMap<String, Object> map = objectMapper.readValue(jsonStr, HashMap.class);
                if (null == map.get("errcode")) {
                    JieqiUser jieqiUser = new JieqiUser();
                    jieqiUser.setOpenid(openid);
                    if (0 == (int) map.get("subscribe")) { //用户没有关注该公众号
                        jieqiUser.setSubscribe(0);
                    } else if (1 == (int) map.get("subscribe")) { //用户关注了该公众号
                        jieqiUser.setSubscribe(1);
                        jieqiUser.setSex((Integer) map.get("sex"));
                        jieqiUser.setNickname((String) map.get("nickname"));
                        jieqiUser.setAvatar((String) map.get("headimgurl"));
                        jieqiUser.setUnionid((String) map.get("unionid"));
                        jieqiUser.setSubscribeTime(DateTimeUtil.stampToDate(String.valueOf((int) map.get("subscribe_time"))));
                        jieqiUser.setSubscribeScene((String) map.get("subscribe_scene"));
                    }
                    response.close();
                    httpClient.close();
                    return userService.createUser(jieqiUser);
                }
            }
        } catch (Exception e) {
//            e.printStackTrace();
            return null;
        }
        return null;
    }
2016-02-22 18:35:51 fgwf1 阅读数 1086
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

微信接入验证Nodejs版例子程序

项目地址: https://github.com/windsome/node-wechat-check-signature.git

介绍

本程序按照微信公众平台开发者文档>开始开发>接入指南,进行开发。
微信使用第三方服务器时要求配置服务器
登录公众平台后,在 基本配置->填写服务器配置 中修改信息时要求填写的URL能正确响应微信发送的Token验证。修改完成后提交时,会去检测URL及TOKEN是否正确,验证正确后返回echostr即表示第三方服务器配置正确,否则错误,见 http://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html

微信已经提供了php版本,见 http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.20140819.zip ,但未提供nodejs版本。

这个验证只是为了确认第三方服务器能将微信服务器发的echostr原样返回(其实还不如不要,估计是微信不希望别人频繁改这个URL)。修改成功后,使用过程中可以将这部分删掉。

前置要求

1, 已经有一台云服务器,已在阿里云上购买
2, 要求有一个域名,已在阿里云上购买
3, 要求域名指向的空间已经备案,已在阿里云上备案

使用方法

以下操作得在服务器上运行,并且此服务器有符合微信要求的域名
1:下载项目
git clone https://github.com/windsome/node-wechat-check-signature.git
2:修改checkSign.js中的TOKEN,修改成你自己在微信中填的那个。
3:npm install
4:sudo npm start
5:再去微信中修改URL为 http://wx.qingshansi.cn/weixin ,提交验证即可
6:之后开发中的微信机器人等也用这个URL

问题列表

1, 修改完配置提交时,提示 “请求URL超时”,有多种可能性。
a)URL写的不对,微信不能访问到
b)域名解析不对,可能刚修改完域名指向,DNS还未全部解析。如果用阿里云的解析,修改完域名地址对应后,需要大概10分钟,微信端服务器才会解析到新的ip地址。
c)服务器在公司内网或者家庭网的内网中,这种服务器响应慢,微信的请求根本就到不了自己的服务器,解决办法是使用阿里云或腾讯云。(我在这里纠结很久,把网站部署到公司内部的老观念不行了。)
d)服务器没有备案,请求会发到服务器,并且也会被成功执行,但阿里云上没备案的网站会返回阿里云的界面,微信就收不到期望的echostr。

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