欢迎各位兄弟 发布技术文章
这里的技术是共享的
公众号支付是指在微信app中访问的页面通过js直接调起微信支付;
因此页面必须是在微信中打开的;
示例项目:https://github.com/baijunyao/thinkphp-bjyadmin
一:设置域名
登录微信公众平台;
微信支付中设置支付授权目录;把域名改为自己的;注意最后是有一个斜线的 /
设置授权域名;
二:导入sdk
/ThinkPHP/Library/Vendor/Weixinpay
好吧;还是没忍住要吐槽;鹅厂的sdk那酸爽谁用谁知道;项目中的sdk是我根据官方文档重构精简打造而成的;
需要注意的是170行处的商品数据需要根据业务实际情况从数据库中获取;
三:配置项
/Application/Common/Conf/config.php
在微信公众平台和微信支付平台凑齐上面这些参数;
四:支付方法
/Application/Api/Controller/WeixinpayController.class.php
需要html的配合:/tpl/Api/Weixinpay/pay.html
调用示例:/Application/Home/Controller/IndexController.class.php 中的wexinpay_js方法
五:异步接收通知
/Application/Api/Controller/WeixinpayController.class.php
//*********************************增加curl_get_contents函数的分割线****************************
如果是整合到自己的项目中;则需要在自己的公共函数中增加curl_get_contents;
/Application/Common/Common/function.php
//*************************关于签名错误的补充*********************************
如果出现签名错误;
可以使用官方的 微信公众平台支付接口调试工具
跟自己生产的签名对比;
然后对比配置;查找不一致的地方;
//*****************关于不知道怎么查看异步发过来的数据的补充*****************
2016.10.28:
好多童鞋在问支付后;不知道怎么查看接收到的支付状态通知;
这里做个补充;首先;我们的服务器必须是外网可以正常访问到的;
必须注意不能有 登录或者权限之类的拦截;
另外补充一个简单的查看收到的内容的方法用于测试;
五:异步接收通知
/Application/Api/Controller/WeixinpayController.class.php
本文为白俊遥原创文章,转载无需和我联系,但请注明来自白俊遥博客https://baijunyao.com 欢迎捐赠赞赏加入组织创建QQ群及捐赠渠道
上一篇: thinkphp整合系列之极验滑动验证码
下一篇: thinkphp整合系列之微信扫码支付
最新评论
总共84条评论
2018-06-09 19:00:55 回复
2018-06-08 16:56:13 回复
2018-04-11 18:41:12 回复
2018-03-21 16:32:38 回复
2018-03-09 15:13:37 回复
2018-01-08 14:49:03 回复
2017-12-25 09:38:25 回复
2017-09-14 17:49:19 回复
2017-09-13 18:56:34 回复
2017-08-24 23:24:01 回复
2017-07-31 13:21:37 回复
回复 Star。:你的这个问题解决了吗??求教。
2017-08-24 17:51:09 回复
回复 Say:晚安,早安:+1
2017-09-13 19:09:45 回复
回复 Star。:亲,搞定了嘛!
2017-10-16 19:04:19 回复
回复 Star。:1.要在微信公众号里面打开网页 2.那个curl_get_contents可能获取不到openid,建议对这个函数优化一下,改成这样public function curl_get_contents($url, $method = 'GET', $data = array()){ if ($method == 'POST') { //使用crul模拟 $ch = curl_init(); //禁用https 'curl_setopt'; curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); //允许请求以文件流的形式返回 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($ch, CURLOPT_DNS_CACHE_TIMEOUT, 30); curl_setopt($ch, CURLOPT_URL, $url); $result = curl_exec($ch); //执行发送 curl_close($ch); } else { if (ini_get('allow_fopen_url') == '1') { $result = file_get_contents($url); } else { //使用crul模拟 $ch = curl_init(); //允许请求以文件流的形式返回 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //禁用https curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_URL, $url); $result = curl_exec($ch); //执行发送 curl_close($ch); } } return $result;}我把函数优化成这样就能成功的获取到openid了。
2017-11-02 09:39:12 回复
回复 鱼.游.游:你好,你可以获取到openid吗
2018-01-08 14:19:02 回复
2017-07-18 16:33:38 回复
2017-07-13 11:06:06 回复
回复 ヤんυó恠ɡυΘ魼:'NOTIFY_URL' => 'http://zm.xxxxx.com/Api/Weixinpay/notify/order_number/'
2017-07-13 11:07:31 回复
2017-07-11 13:15:22 回复
回复 大灰狼:调试可以用微信开发者工具https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1455784140
2017-07-12 23:20:05 回复
2017-07-11 12:03:51 回复
2017-07-11 10:53:26 回复
2017-07-04 19:44:19 回复
2017-06-05 16:29:01 回复
2017-05-18 14:11:20 回复
2017-05-13 09:23:57 回复
2017-03-05 16:37:54 回复
2017-03-02 11:58:26 回复
2017-02-24 00:02:54 回复
2017-02-24 00:02:52 回复
2017-02-22 17:10:42 回复
2017-02-20 16:23:37 回复
2017-01-19 12:05:23 回复
2017-01-16 16:56:25 回复
2017-01-13 13:56:37 回复
2017-01-12 11:47:00 回复
2016-12-12 17:57:28 回复
回复 河边草:notify_url'=>'http://qin.123456.com/index.php?g=course&m=course&a=zhuangtai这种形式能返回数据吗?
2016-12-13 14:00:49 回复
回复 河边草:使用file_put_contents 查看下接收到的数据;
2016-12-22 23:07:28 回复
2016-11-28 16:49:19 回复
2016-11-10 17:56:49 回复
回复 (͡·̮̃·̃) :你不加个判断?先从数据库查出订单状态 再根据这个状态去处理
2016-11-10 18:56:33 回复
回复 (͡·̮̃·̃) :可能是微信那边没有正确接收到成功的返回值;
2016-11-10 22:53:59 回复
回复 云淡风晴:我也出现这种情况 支付成功后 微信没有收到成功的返回值 导致后面的业务逻辑函数重复被调用 不知道怎么解决
2017-01-06 11:00:10 回复
回复 朦胧的下雨天:你好;我看完之后还是不知道怎么下手,我能问你几个简单的问题吗
2017-01-06 15:51:07 回复
回复 朦胧的下雨天:先增加个判断;如果是已经改过状态的;就不要执行更多的业务了;然后再排查原因;
2017-01-07 11:55:57 回复
回复 。:直接贴出来就行;不过;如果还不熟悉流程的;建议需要先把官方的文档通读两边;
2017-01-07 11:56:42 回复
2016-11-07 10:19:34 回复
回复 -_-#:http://baijunyao.com/article/77
2016-11-07 22:46:37 回复
2016-09-14 17:14:36 回复
回复 快乐的刘扬:木有写错吧;我都是非常懒的复制的微信官方文档的代码;https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6
2016-09-15 08:13:47 回复
回复 快乐的刘扬:支付结果 ok 没错呀
2016-09-18 04:03:52 回复
2016-09-14 16:39:20 回复
2016-09-12 20:53:27 回复
回复 守护幸福:麻烦分享下代码?我处理下看是哪的错误;
2016-09-12 21:49:16 回复
回复 云淡风晴:function httpGet($url) { $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_TIMEOUT, 500); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_URL, $url); $res = curl_exec($curl); curl_close($curl); return $res;}这代码我的可以用。
2016-09-12 21:54:24 回复
回复 云淡风晴:另外就是,只要一修改价格的地方就会提示:调用支付JSAPI缺少参数:$Key0$.
2016-09-12 21:55:48 回复
回复 守护幸福:找到问题了。确实是重复支付造成的。
2016-09-12 22:06:21 回复
2016-09-12 12:53:57 回复
2016-09-05 22:33:01 回复
回复 switch多了些break:恩恩;支付没有用到;后续补充的其他操作会用到;
2016-09-05 22:44:38 回复
回复 云淡风晴:跳转至pay界面的时候微信支付的提示一闪而过,提示支付失败 没有找到原因
2016-09-06 17:13:09 回复
回复 云淡风晴:真如“博美云-胡工”所说的 最好加上 alert(res.err_code+res.err_desc+res.err_msg); 这样才好排错,不过问题又来了,think的普通模式支付授权目录应该怎么填呢
2016-09-06 19:14:57 回复
回复 switch多了些break:搞定了 分享下,如果大家是普通模式的话 域名后面只跟一个“/”就可以了
2016-09-06 20:04:40 回复
2016-08-25 18:48:13 回复
2016-08-14 08:33:24 回复
回复 博美云-胡工:你是直接用bjyadmin填写配置项?还是整合到自己已有的项目中呢?如果是整合到自己的项目中;需要增加curl_get_contents函数;我更新到文章的后边了;
2016-08-14 10:42:54 回复
回复 云淡风晴:嗯,注意到了那个函数,已经加入。。。
2016-08-14 12:44:43 回复
回复 云淡风晴:关键是这个$url,里面的参数,appid,密匙,openid,里面都对了,所以我想问问你的话,这个$result正确的话,是返回一个怎样的值...
2016-08-14 12:46:46 回复
回复 博美云-胡工:$url 里面有APPID、APPSECRET、code 三个参数;$result返回正确的话有openid、expires_in等;需要用的就是这个openid;
2016-08-14 14:14:32 回复
回复 云淡风晴:参数我都输出了,是对的,我$result=curl_get_contents($url)的返回值直接输出结果是false,在看是哪里问题..
2016-08-14 14:36:04 回复
回复 博美云-胡工:返回false一般是url有问题;打印$url看看是什么?
2016-08-14 15:17:30 回复
2016-08-14 15:35:45 回复
回复 博美云-胡工:参数值确定是没问题的,是不是少传了什么参数?
2016-08-14 15:37:18 回复
回复 博美云-胡工:跟参数没有关系的;不应该返回false;你直接调用curl_get_contents('http://baijunyao.com');看是否也是返回false;再或者把我的这个示例项目下载下来;然后补充配置项;看可以正常支付不?
2016-08-14 15:59:06 回复
回复 云淡风晴:PC端的扫码支付,我调试成功了,就卡在公众号支付这里,我再仔细对比看看……搞好了,再告知原因
2016-08-14 19:09:56 回复
回复 云淡风晴:找到原因了,生成的支付参数,我通过微信的在线接口调试程序生成的签名,和我程序里生成的签名比对,发现不一样,参数我都统一输出逐一比对了,大小写都是一样,但是生成签名结果不一致。。怪了。。。
2016-08-14 23:23:10 回复
回复 博美云-胡工:调试完成了,现在就只提示我当前页面的URL未注册...估计是我们这个服务地址的问题了,
2016-08-15 11:23:02 回复
回复 云淡风晴:感谢白老师!调好了!你的代码没有问题,页面部分文件建议大家加上WeixinJSBridge.log(res.err_msg); alert(res.err_code+res.err_desc+res.err_msg);参考下官网的demo才醒悟。真的需要耐心,需要大家沉下来多琢磨……
2016-08-15 15:12:55 回复
回复 博美云-胡工:客气了;调试好了就好;
2016-08-15 21:44:42 回复
2016-08-14 08:28:29 回复
2016-08-09 16:58:09 回复
2016-08-08 14:43:21 回复
回复 盘古网络_张书伟:http://php.net/manual/zh/wrappers.php.php
2016-08-08 18:23:50 回复
2016-07-28 11:03:46 回复
2016-07-19 16:01:10 回复
回复 Frances:谢谢;有的;第五步的这个异步接收通知就可以对接app的微信支付;
2016-07-19 21:31:04 回复
回复 云淡风晴:白老大在?我这个异步通知notify文件打出来了就是下面修改订单状态不行 Vendor('Weixinpay.Weixinpay'); $wxpay=new \Weixinpay(); $result=$wxpay->notify(); if ($result) { // 验证成功 修改数据库的订单状态等 $result['out_trade_no']为订单号 $data['order_status']=1; $data['pay_status']=1; $data['pay_time']=time(); $res=M('order')->where('order_sn='.$result['out_trade_no'])->save($data); }怎么回事?
2018-03-09 11:56:18 回复
回复 迈克:微信支付完成notify收到的参数里头没有out_trade_no ???这是什么情况
2018-03-09 12:03:09 回复
吢伤:invalid out_trade_no 这是为什么啊
2018-06-13 18:25:05 回复