thinkphp整合系列之微信扫码支付

微信作为移动互联网的航空母舰;
在支付发力后;现在也是不容小觑的;
在线下的很多场景中比支付宝更甚;
君不见连路边的小贩都支持二维码扫一扫支付了;
此处是省略500字的微信支付开通过程;
示例项目:https://github.com/baijunyao/thinkphp-bjyadmin
一:导入sdk
/ThinkPHP/Library/Vendor/Weixinpay
鹅厂的sdk那酸爽谁用谁知道;就不吐槽了;项目中的sdk是我根据官方文档重构精简打造而成的;
二:配置项
/Application/Common/Conf/config.php

'WEIXINPAY_CONFIG'       => array(
    'APPID'              => '', // 微信支付APPID
    'MCHID'              => '', // 微信支付MCHID 商户收款账号
    'KEY'                => '', // 微信支付KEY
    'APPSECRET'          => '', // 公众帐号secert (公众号支付专用)
    'NOTIFY_URL'         => 'http://baijunyao.com/Api/Weixinpay/notify', // 接收支付状态的连接
    ),

开通微信支付后;会收到一封包含账号密码的邮件;登录微信支付凑齐上面这些参数;
三:支付函数
/Application/Common/Common/function.php

/**
 * 微信扫码支付
 * @param  array $order 订单 必须包含支付所需要的参数 body(产品描述)、total_fee(订单金额)、out_trade_no(订单号)、product_id(产品id)
 */
function weixinpay($order){
    $order['trade_type']='NATIVE';
    Vendor('Weixinpay.Weixinpay');
    $weixinpay=new \Weixinpay();
    $weixinpay->pay($order);
}

调用函数会生成一个二维码;用微信扫码即可支付;

// 虚拟的订单 请根据实际业务更改
$time=time();
$order=array(
    'body'=>'test',
    'total_fee'=>1,
    'out_trade_no'=>strval($time),
    'product_id'=>1
    );
weixinpay($order);

四:异步接收通知
/Application/Api/Controller/WeixinpayController.class.php

/**
 * notify_url接收页面
 */
public function notify(){
    // 导入微信支付sdk
    Vendor('Weixinpay.Weixinpay');
    $wxpay=new \Weixinpay();
    $result=$wxpay->notify();
    if ($result) {
        // 验证成功 修改数据库的订单状态等 $result['out_trade_no']为订单id

    }
}

和支付宝不同的是;微信支付并没有支付成功后跳转回来的过程;所以都是异步接收通知的;
//*************************收到反馈后补充的分割线*********************************
如果是整合到自己已有的项目中;则需要添加生成二维码的函数;
具体的可以参考 thinkphp整合系列之phpqrcode生成二维码

//*************************关于签名错误的拍错*********************************
如果出现签名错误;
可以使用官方的 微信公众平台支付接口调试工具
跟自己生产的签名对比;
然后对比配置;查找不一致的地方;

//*****************关于不知道怎么查看异步发过来的数据的补充*****************
2016.10.28:
好多童鞋在问支付后;不知道怎么查看接收到的支付状态通知;
这里做个补充;首先;我们的服务器必须是外网可以正常访问到的;
必须注意不能有 登录或者权限之类的拦截;
另外补充一个简单的查看收到的内容的方法用于测试;
四:异步接收通知
/Application/Api/Controller/WeixinpayController.class.php

/**
 * notify_url接收页面
 */
public function notify(){
    // ↓↓↓下面的file_put_contents是用来简单查看异步发过来的数据 测试完可以删除;↓↓↓
    // 获取xml
    $xml=file_get_contents('php://input', 'r');
    //转成php数组 禁止引用外部xml实体
    libxml_disable_entity_loader(true);
    $data= json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA));
    file_put_contents('./notify.text', $data);
    // ↑↑↑上面的file_put_contents是用来简单查看异步发过来的数据 测试完可以删除;↑↑↑
    // 导入微信支付sdk
    Vendor('Weixinpay.Weixinpay');
    $wxpay=new \Weixinpay();
    $result=$wxpay->notify();
    if ($result) {
        // 验证成功 修改数据库的订单状态等 $result['out_trade_no']为订单id

    }
}

白俊遥博客

 白俊遥博客
请先登录后发表评论
  • 最新评论
  • 总共37条评论
 白俊遥博客

$key:为什么生成的二维码放进页面会跟那个调用的模板会有点冲突?生成的二维码在页面的上部会出现一窜乱码字符,那个字符计划就是那个weixinpay()函数放在那个方法里面出现的,请问大神们怎么解决?

2017-07-21 16:54:35 回复

 白俊遥博客
  • 云淡风晴 回复 $key:目测二维码生成出错了;看下错误信息;
  • 2017-07-24 22:55:41 回复
 白俊遥博客

年年有鱼:请问,如何调整页面中二维码的位置?谢谢

2017-07-03 20:57:43 回复

 白俊遥博客
  • 年年有鱼 回复 年年有鱼:已经解决了。
  • 2017-07-03 22:14:45 回复
 白俊遥博客

年年有鱼:请问,如何调整页面中二维码的位置?谢谢

2017-07-03 20:57:22 回复

 白俊遥博客
  • $key 回复 年年有鱼:我也不知道,你是怎么解决的?
  • 2017-07-06 11:21:09 回复
 白俊遥博客

DMC·但丁:我在if($result)下写入修改数据库,但是并没有执行,然后上面测试的notify.text却成功建出来了,我尝试把上面的测试移到if里,也成功建立了,说明result有值,那么为什么result下的数据库修改代码没有修改呢……

2017-06-09 09:29:54 回复

 白俊遥博客
  • DMC·但丁 回复 DMC·但丁:哦,之前的问题解决了,但是修改数据库之后跳转要怎么办?success好像不行……
  • 2017-06-09 10:10:45 回复
 白俊遥博客
  • 云淡风晴 回复 DMC·但丁:简单的方法就是使用ajax轮询了;
  • 2017-06-18 22:12:10 回复
 白俊遥博客

年年有鱼:请问为什么,total_fee直接赋值为1或者其它数字,可以用。但是改成代码赋值就提示签名错误

2017-05-26 11:17:41 回复

 白俊遥博客
  • 年年有鱼 回复 年年有鱼:问题已经解决
  • 2017-05-27 09:58:47 回复
 白俊遥博客

商盟@刘帅:你好方便留一个QQ吗  我有一个问题咨询吧

2017-05-17 09:18:49 回复

 白俊遥博客

呆呆:我想问一下,为嘛我从git上下载好你的程序,安装向导,四步安装后,跳转到界面是空白的,该怎么用呀,小白求教。

2017-03-22 11:14:01 回复

 白俊遥博客

php--李小博:急 急  otify_url 返回给服务SUCCESS了 为什么还一直通知     支付成功一直返回结果一直通知。

2017-03-17 15:06:00 回复

 白俊遥博客
  • 呆呆 回复 php--李小博:你是怎么调通的,为嘛我下载示例提示四步安装后啥都没有。
  • 2017-03-22 11:14:50 回复
 白俊遥博客

”这一切都是错觉“:想问一下

2017-03-15 17:12:48 回复

 白俊遥博客
  • php--李小博 回复 ”这一切都是错觉“:你的调试好了吗 ?otify_url 返回给服务SUCCESS了 为什么还一直通知
  • 2017-03-17 14:57:12 回复
 白俊遥博客

嗓音少了许多:执行weixinpay()方法后,显示证书错误,错误码35. 统一下单中的curl还需要设置什么吗?

2017-03-05 16:12:14 回复

 白俊遥博客

:????

2017-02-20 11:57:59 回复

 白俊遥博客

⌒☆善☆⌒:pay.html里面的getOrder()在哪里啊,我怎么找不到啊。

2017-02-19 22:52:45 回复

 白俊遥博客

哇牛:微信支付 notify_url 返回给服务SUCCESS了 为什么还一直通知

2017-01-19 16:16:29 回复

 白俊遥博客
  • php--李小博 回复 哇牛:是啊  为什么一直通知?我也在问这个问题  你找到解决办法了吗
  • 2017-03-17 14:56:18 回复
 白俊遥博客

jack Zhang:扫描二维码调整提示无法找到页面,原因其实是再二维码生成的functi> */    QRcode::png($url,false,QR_ECLEVEL_L,$size,2,false,0xFFFFFF,0x000000);}这个就可以,微信生成二维码的地址是不需要http的。

2017-01-16 16:59:22 回复

 白俊遥博客
  • 云淡风晴 回复 jack Zhang:恩恩;多谢提醒;生成二维码的那篇文章是专门为url设计的;这里引用的时候;没有明确说明;已经改了;
  • 2017-01-28 21:51:07 回复
 白俊遥博客

晴天:谢谢啊

2017-01-07 17:02:20 回复

 白俊遥博客

吉尔科技-袁:微信页显示支付成功  但是notify.text文件为空  而且扫码页静止   怎么弹出成功  失败

2016-12-16 09:19:31 回复

 白俊遥博客
  • 吉尔科技-袁 回复 吉尔科技-袁:返回已经解决  再找找怎么跳转的
  • 2016-12-16 09:48:18 回复
 白俊遥博客
  • 云淡风晴 回复 吉尔科技-袁:使用ajax轮询或者websocket;
  • 2016-12-22 22:58:44 回复
 白俊遥博客
  • php--李小博 回复 吉尔科技-袁:notify.text这个文件在生成在哪里?
  • 2017-03-16 15:33:29 回复
 白俊遥博客
  • php--李小博 回复 吉尔科技-袁:支付成功返回结果你怎么解决的?
  • 2017-03-17 10:02:52 回复
 白俊遥博客

王晓:大神你好,我根据你改写的做了下测试,生成二维码扫锚支付没问题,但是没有返回值,   public function weixinpay_qrcode(){        // 此处根据实际业务情况生成订单 然后拿着订单去支付        // 虚拟的订单 请根据实际业务更改        $time=time();        $order=array(            'body'=>'test',            'total_fee'=>1,            'out_trade_no'=>strval($time),            'product_id'=>1            );        weixinpay($order);    }public function notify(){    // 导入微信支付sdk    Vendor('Weixinpay.Weixinpay');    $wxpay=new \Weixinpay();    $result=$wxpay->notify();    if ($result) {        echo $result['out_trade_no'];             }else{ echo "ERROR"; }}结果不管怎么刷新返回的都ERROR。求指导。

2016-12-13 23:22:05 回复

 白俊遥博客
  • 王晓 回复 王晓:另外,我也看了别人的,发现他们在AJAX返回时,有返回一个订单号然后就能获取到返回值,是不是notify方法也需要接收订单号才能得到付款是否成功的结果?
  • 2016-12-13 23:24:16 回复
 白俊遥博客
  • 云淡风晴 回复 王晓:notify() 是用来接收微信的服务器发送过来的支付状态通知的;接收到通知后;改变订单状态即可;然后前端通过ajax轮询;或者websocket获取支付状态;不能直接访问notify()的;
  • 2016-12-22 23:02:01 回复
 白俊遥博客

许少年:俊哥,微信扫码支付,可以自定义金额吗,就是用户扫码后,输入自定义金额?还是只能用JSAPI的微信支付,

2016-11-17 11:47:41 回复

 白俊遥博客
  • 云淡风晴 回复 许少年:是定义好金额;扫码后就支付了;
  • 2016-12-05 23:19:28 回复
 白俊遥博客

镜像猫工:请问控制器生成的二维码怎么分配到前端?我需要控制样式。

2016-11-09 00:24:41 回复

 白俊遥博客
  • 镜像猫工 回复 镜像猫工:已经得到解决,谢谢!
  • 2016-11-09 12:23:20 回复
 白俊遥博客
  • $key 回复 镜像猫工:你怎么解决的 ,我也不会,教教我
  • 2017-07-06 14:27:47 回复
 白俊遥博客

梵梵✅:支付后如何执行添加订单到数据库呢?

2016-11-03 15:08:57 回复

 白俊遥博客
  • 云淡风晴 回复 梵梵✅:$result['out_trade_no']是订单号;剩下的就根据业务的实际情况写了;
  • 2016-11-03 23:54:16 回复
 白俊遥博客

狼来了:你好,为什么有时可以生成二维码,有时却不行?有时我输入的订单号商品id等数据可以生成,有时却不行

2016-10-27 14:18:52 回复

 白俊遥博客
  • 云淡风晴 回复 狼来了:要保证订单号唯一;
  • 2016-10-28 00:29:55 回复
 白俊遥博客

————————————:还是没回调出来

2016-10-25 15:00:48 回复

 白俊遥博客
  • 云淡风晴 回复 ————————————:我补充到文章的最后了;可以参考下;
  • 2016-10-28 00:29:32 回复
 白俊遥博客

————————————:四:异步接收通知  是微信服务器会主动发信息到这个地址吗?

2016-10-25 14:27:55 回复

 白俊遥博客
  • 云淡风晴 回复 ————————————:是的;
  • 2016-10-27 00:17:39 回复
 白俊遥博客
  • ———————————— 回复 云淡风晴:那为什么我的就收不到呢?
  • 2016-10-27 20:38:47 回复
 白俊遥博客
  • ———————————— 回复 云淡风晴:确定按照步骤来没有漏掉的吧?
  • 2016-10-27 20:39:06 回复
 白俊遥博客
  • 云淡风晴 回复 ————————————:补充到文章后面了;先测下是否收到post数据了;
  • 2016-10-31 23:44:12 回复
 白俊遥博客

也许o永远不会得到我想要的:我是刚学php不久,看不懂,能具体点吗

2016-10-21 10:55:42 回复

 白俊遥博客
  • 云淡风晴 回复 也许o永远不会得到我想要的:下载下来;按照步骤走即可;
  • 2016-10-22 00:40:29 回复
 白俊遥博客

Developer:博主好,您这个微信扫码支付是模式一还是模式二,麻烦问下微信支付key是必须的吗?微信支付key是指的商户支付密钥吗?

2016-10-17 09:47:58 回复

 白俊遥博客
  • 云淡风晴 回复 Developer:模式二;是秘钥;必须的;
  • 2016-10-18 23:59:50 回复
 白俊遥博客

啊爽啊_:博主你好 我想问下扫码支付成功之后 如何判断支付状态 并且进入下一个动作呢?

2016-10-10 11:22:01 回复

 白俊遥博客
  • 云淡风晴 回复 啊爽啊_:可以使用ajax轮询;
  • 2016-10-11 23:08:31 回复
 白俊遥博客

流星雨:问下 签名错误的原因  非常纠结

2016-09-20 11:20:56 回复

 白俊遥博客
  • 云淡风晴 回复 流星雨:使用官方提供的工具;对比下;看哪一步出现了错误;链接补充在文章的后面了;
  • 2016-09-20 22:37:05 回复
 白俊遥博客

时空七国:你这个支付回调有问题吧,支付成功后,回调不了file_get_contents('php://input', 'r')--->$GLOBALS['HTTP_RAW_POST_DATA']

2016-09-18 16:05:04 回复

 白俊遥博客
  • 云淡风晴 回复 时空七国:配置正确是没问题的;表示线上项目一直正常支付中;
  • 2016-09-18 22:40:05 回复
 白俊遥博客

时空七国:appid参数长度有误

2016-09-17 15:49:21 回复

 白俊遥博客

白。:想请问一下pay方法里$result['code_url']是哪里返回的啊

2016-09-13 10:38:31 回复

 白俊遥博客
  • 云淡风晴 回复 白。:unifiedOrder 方法返回的;
  • 2016-09-18 22:42:19 回复
 白俊遥博客

丿Amour _:楼主大神   我把你的项目下载下来了  然后就是配置过之后发送邮件提示SMTP connect() failed   这是为什么啊  求回复

2016-09-06 11:38:20 回复

 白俊遥博客
  • 云淡风晴 回复 丿Amour _:看phpemail那篇文章;我更新了;
  • 2016-09-18 22:41:00 回复
 白俊遥博客

4暮:因存在错误而无法显示  gd库也开了。

2016-08-04 17:07:29 回复

 白俊遥博客
  • 云淡风晴 回复 4暮:是下载的最新版的bjyadmin么?
  • 2016-08-04 17:17:57 回复
 白俊遥博客
  • 4暮 回复 云淡风晴:是的 是的
  • 2016-08-04 17:26:19 回复
 白俊遥博客
  • 云淡风晴 回复 4暮:/Application/Common/Common/function.php文件的1184行增加  p($url);die;  看显示的是什么?
  • 2016-08-04 17:30:49 回复
 白俊遥博客
  • 4暮 回复 云淡风晴:weixin://wxpay/bizpayurl?pr=n9FN5oh
  • 2016-08-04 17:34:31 回复
 白俊遥博客
  • 云淡风晴 回复 4暮:连接已经正确生成了;把p($url);die; 换成  p(extension_loaded('gd'));p(gd_info());die; 如果打印的是true;并且各种Support=1;那表示gd库正常启用了;否则;目测就是环境的问题;
  • 2016-08-04 17:43:47 回复
 白俊遥博客
  • 4暮 回复 云淡风晴:1Array ( [GD Version] => bundled (2.1.0 compatible) [FreeType Support] => 1 [FreeType Linkage] => with freetype [T1Lib Support] => [GIF Read Support] => 1 [GIF Create Support] => 1 [JPEG Support] => 1 [PNG Support] => 1 [WBMP Support] => 1 [XPM Support] => [XBM Support] => 1 [WebP Support] => [JIS-mapped Japanese Font Support] => )有三个值是空
  • 2016-08-04 17:47:18 回复
 白俊遥博客
  • 云淡风晴 回复 4暮:/ThinkPHP/Library/Vendor/Phpqrcode/phpqrcode.php  第960行前面添加 die;   然后看页面有什么内容输出;
  • 2016-08-04 17:58:57 回复
 白俊遥博客
  • 4暮 回复 云淡风晴:输出为空
  • 2016-08-04 18:01:03 回复
 白俊遥博客
  • 云淡风晴 回复 4暮:你这个环境可以生成图片验证码么?http://document.thinkphp.cn/manual_3_2.html#verify
  • 2016-08-04 18:02:28 回复
 白俊遥博客
  • 4暮 回复 云淡风晴:可以的 没问题。前两天刚做的验证码
  • 2016-08-04 18:03:23 回复
 白俊遥博客
  • 云淡风晴 回复 4暮:跳出微信支付的业务逻辑;直接生成二维码也不可以吗?http://baijunyao.com/article/71
  • 2016-08-04 18:06:27 回复
 白俊遥博客
  • 4暮 回复 云淡风晴:始终提示QRcode' not found这个错误
  • 2016-08-04 18:08:06 回复
 白俊遥博客
  • 云淡风晴 回复 4暮:去掉你项目中的敏感数据;然后打给包发我邮箱;我看看;baijunyao@baijunyao.com
  • 2016-08-04 18:10:11 回复
 白俊遥博客
  • 4暮 回复 云淡风晴:谢谢您了。我刚解决了。在生成二维码前qrcode($decodeurl);这行代码前面加上ob_clean();这一句就行了
  • 2016-08-04 18:33:11 回复
 白俊遥博客
  • ALLeys 回复 云淡风晴:好认真 手把手教学呢 .
  • 2016-08-25 00:10:13 回复
 白俊遥博客

4暮:Call to undefined function qrcode()提示这个错误 请问是怎么回事呢

2016-08-04 16:09:58 回复

 白俊遥博客
  • 云淡风晴 回复 4暮:整合到已有项目中的话;需要先增加生成二维码的方法:http://baijunyao.com/article/71
  • 2016-08-04 16:19:18 回复
 白俊遥博客
  • 4暮 回复 云淡风晴:问一下您项目里调用方法为什么前面不用加$this->
  • 2016-08-04 16:26:35 回复
 白俊遥博客
  • 云淡风晴 回复 4暮:调用的是/Application/Common/Common/function.php中的函数;不是方法;不需要$this->
  • 2016-08-04 16:36:50 回复
 白俊遥博客

”这一切都是错觉“:图像“http://localhost/index.php/Home/Index/wexinpay_qrcode”因存在错误而无法显示。

2016-07-28 11:22:31 回复

 白俊遥博客
  • ”这一切都是错觉“ 回复 ”这一切都是错觉“:图像“http://ywangwang.com/App/Index/wexinpay_qrcode”因存在错误而无法显示。 放公网上也是报这个错误
  • 2016-07-28 12:51:35 回复
 白俊遥博客
  • ”这一切都是错觉“ 回复 ”这一切都是错觉“:图像“http://ywangwang.com/App/Index/wexinpay_qrcode”因存在错误而无法显示。 放公网上也是报这个错误
  • 2016-07-28 12:51:42 回复
 白俊遥博客
  • 云淡风晴 回复 ”这一切都是错觉“:检查是否开启了GD库;
  • 2016-07-28 12:54:10 回复
 白俊遥博客
  • ”这一切都是错觉“ 回复 云淡风晴:GD库是开启的
  • 2016-07-28 13:37:06 回复
 白俊遥博客
  • ”这一切都是错觉“ 回复 云淡风晴:是图像没生成
  • 2016-07-28 13:40:38 回复
 白俊遥博客
  • ”这一切都是错觉“ 回复 ”这一切都是错觉“:ssl证书的问题,现在已生成weixin://wxpay/bizpayurl?pr=XXXXX 这种二维码。但微信端扫码后,显示无法打开网页,进不到支付页面
  • 2016-07-28 16:29:59 回复
 白俊遥博客
  • 云淡风晴 回复 ”这一切都是错觉“:你环境没有指定curl.cainfo路径的问题;稍等处理下兼容;更新一个版本;
  • 2016-07-28 16:33:19 回复
 白俊遥博客
  • 云淡风晴 回复 ”这一切都是错觉“:下载个最新版的试下?http://git.oschina.net/shuaibai123/thinkphp-bjyadmin
  • 2016-07-28 17:03:52 回复
 白俊遥博客
  • ”这一切都是错觉“ 回复 云淡风晴:已经可以了,谢谢耐心解答哈!
  • 2016-07-29 10:08:26 回复
 白俊遥博客
  • ”这一切都是错觉“ 回复 ”这一切都是错觉“:支付是可以支付了,但public function notify(){        // 导入微信支付sdk        Vendor('Weixinpay.Weixinpay');        $wxpay=new \Weixinpay();        $result=$wxpay->notify();        dump($result);,支付成功后的回调不成功,dump的结果是bool(false)
  • 2016-07-29 12:41:58 回复
 白俊遥博客
  • 云淡风晴 回复 ”这一切都是错觉“:异步接收的数据是不能dump的;你把dump换成file_put_contents('./result.php', json_encode($result));然后支付后在根目录下找result.php文件;
  • 2016-07-29 12:51:13 回复
 白俊遥博客

零度温柔:Weixinpay2.WeixinpayWeixinpay2在哪里

2016-07-25 23:55:01 回复

 白俊遥博客
  • 云淡风晴 回复 零度温柔:抱歉;手误;是Weixinpay;已经改过来了;谢谢反馈;
  • 2016-07-26 08:52:24 回复
 白俊遥博客

孙鹏:扫码白屏什么原因

2016-07-18 16:18:16 回复

 白俊遥博客
  • 云淡风晴 回复 孙鹏:配置项没填对吧?
  • 2016-07-18 20:33:22 回复
 白俊遥博客

Beisha:我顶

2016-07-12 10:50:14 回复

 白俊遥博客
  • 回复 Beisha:你妹
  • 2016-07-13 15:59:47 回复
  • 本站使用自主开发的laravel-bjyblog开源博客程序搭建 © 2014-2017 baijunyao.com 版权所有 ICP证:豫ICP备14009546号-3
  • 联系邮箱:baijunyao@baijunyao.com