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是用来简单查看异步发过来的数据 测试完可以删除;
    file_put_contents('./notify.text', json_encode($_POST));
    // 导入微信支付sdk
    Vendor('Weixinpay.Weixinpay');
    $wxpay=new \Weixinpay();
    $result=$wxpay->notify();
    if ($result) {
        // 验证成功 修改数据库的订单状态等 $result['out_trade_no']为订单id
        
    }
}


白俊遥博客

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

许少年:俊哥,微信扫码支付,可以自定义金额吗,就是用户扫码后,输入自定义金额?还是只能用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 回复
白俊遥博客

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

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 回复
白俊遥博客
  • 云淡风晴 回复 云淡风晴:跳出微信支付的业务逻辑;直接生成二维码也不可以吗?http://baijunyao.com/article/71
  • 2016-08-04 18:05:34 回复
白俊遥博客
  • 云淡风晴 回复 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 回复
白俊遥博客

b e s t _北沙:我顶

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

白俊遥博客
  • 回复 b e s t _北沙:你妹
  • 2016-07-13 15:59:47 回复