年底了,反而工作更忙了,我从15年11月开始写《1024伐木累》系列小说和爆笑对白,得到了很多身边的技术好友的支持,现在爆笑对白已经有越来越多的朋友一起帮着写段子,整理,包括小说内容的编辑工作等。虽然《1024伐木累》得到的褒贬不一,但是,对我来说,坚持的过程还是快乐的。我一直有一个愿望,也愿意一直坚持着尝试下去,包括我在公司做技术管理一样,传递给身边程序员小伙伴的思想只有一个:快快乐乐工作,健健康康编码。我想能够参与到技术开发中来的朋友,都希望如此。所以,小说的目的,是希望处于不同开发阶段的朋友,找到自己的方向,最终实现自己的人生价值。而爆笑对白的制作,就是想让更多的程序工作者得到快乐,哪怕只是瞬间的。
回归主题,16年1月初我对微信开发比较好奇,由于自己是一个比较喜欢钱的人,所以对支付功能颇为冲动,就用公司信息在微信平台申请了一个服务号,还给腾讯打赏了300大洋做了下认证,抽空看了下微信支付官方的文档,大概了解了一下微信支付的流程以及开发过程,说实话,虽然看完了,但是对微信官方提供的文档有些不满,感觉不清不楚的,但是大概的支付方式已经了解,这时候,我的懒劲又来了,在网上找到了做微信对接的C#SDK:Senparc.Weixin.MP。这个类库的封装,在我看来,还是不错的,基本囊货了微信的功能,并且在不断的完善。类库是开源的,每个功能都有写简单的单元测试,看起来一目了然。主要对接DLL对应的功能如下:
公众号+微信支付 SDK:Senparc.Weixin.MP.dll
企业号 SDK:Senparc.Weixin.QY.dll
开放平台 SDK:Senparc.Weixin.Open.dll
官方地址:http://weixin.senparc.com/
当然,我们要完成公众号微信支付功能的开发,需要使用Senparc.Weixin.MP.dll这个DLL,查阅了一下官方提供的DEMO以及教程,并没有载入微信支付相关的说明,没办法,既然拿到源码了,自己找吧。
打开Senparc.Weixin.MP.sln,根据英文文件夹名称的分类,可以初步判断,关于微信支付,被封装在TenPayLib文件夹中,但是我还发现,里面存在名称叫“TenPayLibV3”的文件夹,那如何选择呢?网上搜索了一下,得出这个结论:2014年9月10号之前申请的为v2版,之后申请的为v3版。我用来测试微信支付的服务号是在16年刚申请,并且通过验证的,那么果断使用V3吧。
打开TenPayLibV3文件夹:
这里发现多个类库,每一个都是做什么的呢?我们这里不一一叙述,感兴趣的朋友可以下载来看,每一个类的文件头都有功能说明与描述,对照微信官方支付说明,我们直接开始做支付。
进入微信公众号,点击功能菜单中的微信支付:并相应点击 使用教程-公众号支付
迅速对文档内容重温、浏览,以方便在Senparc.Weixin.MP.dll中查找相应的功能。
先配置支付授权目录,添加支付测试白名单,支付目录只支持三个,并且域名必须经过ICP备案。授权目录的作用是,如果要发起微信支付请求,请求的链接地址必须在授权目录下,否则身份无效,支付不能成功。测试白名单中添加的个人微信号,才能完成微信支付测试目录支付的测试,不在白名单中人员发起支付申请,支付不能成功。
配置完成后,如何调用呢?我们继续看官方说明:H5调起支付API
“在微信浏览器里面打开H5网页中执行JS调起支付。接口输入输出数据格式为JSON。
注意:WeixinJSBridge内置对象在其他浏览器中无效。
列表中参数名区分大小,大小写错误签名验证会失败。”
OK,这里说明了几个事情,第一必须在微信浏览器进行;第二,参数区分大小写;第三,数据格式为JSON。
官方说明,只要在页面中调用如下脚本,即可开启微信支付功能:
1 function onBridgeReady(){ 2 WeixinJSBridge.invoke( 3 'getBrandWCPayRequest', { 4 "appId" : "wx2421b1c4370ec43b", //公众号名称,由商户传入 5 "timeStamp":" 1395712654", //时间戳,自1970年以来的秒数 6 "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串 7 "package" : "prepay_id=u802345jgfjsdfgsdg888", 8 "signType" : "MD5", //微信签名方式: 9 "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名 10 }, 11 function(res){ 12 if(res.err_msg == "get_brand_wcpay_request:ok" ) {} // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回 ok,但并不保证它绝对可靠。 13 } 14 ); 15 } 16 if (typeof WeixinJSBridge == "undefined"){ 17 if( document.addEventListener ){ 18 document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false); 19 }else if (document.attachEvent){ 20 document.attachEvent('WeixinJSBridgeReady', onBridgeReady); 21 document.attachEvent('onWeixinJSBridgeReady', onBridgeReady); 22 } 23 }else{ 24 onBridgeReady(); 25 }