thinkphp整合系列之微信公众号支付

公众号支付是指在微信app中访问的页面通过js直接调起微信支付;
因此页面必须是在微信中打开的;
示例项目:https://github.com/baijunyao/thinkphp-bjyadmin
一:设置域名
登录微信公众平台;
微信支付中设置支付授权目录;把域名改为自己的;
注意最后是有一个斜线的 /
白俊遥博客
设置授权域名;
白俊遥博客
二:导入sdk
/ThinkPHP/Library/Vendor/Weixinpay
好吧;还是没忍住要吐槽;鹅厂的sdk那酸爽谁用谁知道;项目中的sdk是我根据官方文档重构精简打造而成的;
需要注意的是170行处的商品数据需要根据业务实际情况从数据库中获取;

$openid=$result['openid'];
// 订单数据  请根据订单号out_trade_no 从数据库中查出实际的body、total_fee、out_trade_no、product_id
$order=array(
    'body'=>'test',// 商品描述(需要根据自己的业务修改)
    'total_fee'=>1,// 订单金额  以(分)为单位(需要根据自己的业务修改)
    'out_trade_no'=>$out_trade_no,// 订单号(需要根据自己的业务修改)
    'product_id'=>'1',// 商品id(需要根据自己的业务修改)
    'trade_type'=>'JSAPI',// JSAPI公众号支付
    'openid'=>$openid// 获取到的openid
);

三:配置项
/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/Api/Controller/WeixinpayController.class.php

/**
 * 公众号支付 必须以get形式传递 out_trade_no 参数
 * 示例请看 /Application/Home/Controller/IndexController.class.php
 * 中的wexinpay_js方法
 */
public function pay(){
    // 导入微信支付sdk
    Vendor('Weixinpay.Weixinpay');
    $wxpay=new \Weixinpay();
    // 获取jssdk需要用到的数据
    $data=$wxpay->getParameters();
    // 将数据分配到前台页面
    $assign=array(
        'data'=>json_encode($data)
        );
    $this->assign($assign);
    $this->display();
}

需要html的配合:/tpl/Api/Weixinpay/pay.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body style="text-align: center;">
<button onclick="getOrder()">购买</button>

<jquery />
<script>
function onBridgeReady(){
    var data={$data};
    WeixinJSBridge.invoke(
        'getBrandWCPayRequest', data,
        function(res){
            if(res.err_msg == "get_brand_wcpay_request:ok" ) {
                // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回    ok,但并不保证它绝对可靠。
            }else{
                alert(res.err_code+res.err_desc+res.err_msg); // 显示错误信息
            }
        }
    );
}
 if (typeof WeixinJSBridge == "undefined"){
     if( document.addEventListener ){
         document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
     }else if (document.attachEvent){
         document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
         document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
     }
 }else{
      onBridgeReady();
 }
</script>
</body>
</html>

调用示例:/Application/Home/Controller/IndexController.class.php 中的wexinpay_js方法

/**
 * 微信 公众号jssdk支付
 */
public function wexinpay_js(){
    // 此处根据实际业务情况生成订单 然后拿着订单去支付
    // 用时间戳虚拟一个订单号  (请根据实际业务更改)
    $out_trade_no=time();
    // 组合url
    $url=U('Api/Weixinpay/pay',array('out_trade_no'=>$out_trade_no));
    // 前往支付
    redirect($url);
}

五:异步接收通知
/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

    }
}

//*********************************增加curl_get_contents函数的分割线****************************
如果是整合到自己的项目中;则需要在自己的公共函数中增加curl_get_contents;
/Application/Common/Common/function.php

/**
 * 使用curl获取远程数据
 * @param  string $url url连接
 * @return string      获取到的数据
 */
function curl_get_contents($url){
    $ch=curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);                //设置访问的url地址
    // curl_setopt($ch,CURLOPT_HEADER,1);               //是否显示头部信息
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);               //设置超时
    curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);   //用户访问代理 User-Agent
    curl_setopt($ch, CURLOPT_REFERER,$_SERVER['HTTP_HOST']);        //设置 referer
    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);          //跟踪301
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        //返回结果
    $r=curl_exec($ch);
    curl_close($ch);
    return $r;
}

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

//*****************关于不知道怎么查看异步发过来的数据的补充*****************
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

    }
}

白俊遥博客
请先登录后发表评论
  • latest comments
  • 总共192条评论
白俊遥博客

颜良 :请问一下,我做前后端分离,用ajax怎么调支付接口呢?我出现签名错误

2019-01-09 19:41:51 回复

白俊遥博客

:invalid out_trade_no 这是为什么啊白俊遥博客

2018-12-12 08:55:13 回复

白俊遥博客

satan :有一个疑问:关于支付成功以后,微信服务端往我们的回调地址发送回调通知。好像没有对发送过来的消息进行验签,如果是别人恶意的往我们的回调地址发通知。那不是很危险吗 ?

2018-09-06 09:48:35 回复

白俊遥博客

丑人多作怪 :您好,为什么返回code被重复使用呢?方便加一下qq吗? 2562118216谢谢!

2018-06-26 15:27:58 回复

白俊遥博客

吢伤 :invalid out_trade_no 这是为什么啊白俊遥博客

2018-06-13 18:25:05 回复

白俊遥博客 白俊遥博客

云淡风晴 :QQ联系你了;

2018-06-24 19:42:18 回复

白俊遥博客

liujunfengyunjunyao :请问您一下 如果是前后端分离 怎么处理

2018-06-09 19:00:55 回复

白俊遥博客

七情 :解决了, 谢谢您的demo

2018-06-08 17:04:12 回复

白俊遥博客

吢伤 :你好   能问你几个问题吗  卡住了白俊遥博客  方便加一下QQ吗    2270086398

2018-06-13 18:21:16 回复

白俊遥博客

七情 :请问一下账单数据怎么传输?

2018-06-08 16:56:13 回复

白俊遥博客

做不了你的郎做你爹 :调起支付时,报 -1调用支付JSAPI缺少参数:appId

2018-04-11 18:41:12 回复

白俊遥博客

+-*/ :请问为什么老是获取不到openid,code获取到了

2018-03-21 16:32:38 回复

白俊遥博客

迈克 :异步回调notify然后有返回值,{"appid":"wxd98807651895d066","bank_type":"CFT","cash_fee":"1","fee_type":"CNY","is_subscribe":"Y","mch_id":"1497839372","nonce_str":"test","openid":"oHE1A0eqFxDUDzRaFojGZ664Cxto","out_trade_no":"5aa23375d47e1","result_code":"SUCCESS","return_code":"SUCCESS","sign":"5DF095F00DD9D93C051A460B6566754D","time_end":"20180309151052","total_fee":"1","trade_type":"JSAPI","transaction_id":"4200000059201803095572170541"} // 导入微信支付sdk        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();     M('order')->where('order_sn='.$result['out_trade_no'])->save($data);         }我这里是tp3.23,修改订单状态一直不成功

2018-03-09 15:13:37 回复

白俊遥博客

风声依旧 :为什么总是出现“JSAPI支付必须传openid”的错误提示

2018-01-08 14:49:03 回复

白俊遥博客

賈四歲 :请问 签名错误,然后获取不到prepay_id  , invalid appsecret报这个,可是对比了,没发现什么问题呀,请问是哪里的问题

2018-01-08 10:53:53 回复

白俊遥博客 白俊遥博客

云淡风晴 :签名错误?使用官方的签名校验工具看下;

2018-01-22 05:41:22 回复

白俊遥博客

富库网 :白老大,是不是该写篇微信的H5支付了

2017-12-25 09:38:25 回复

白俊遥博客

PHP__虞意 :大神,没有openid的传入怎么处理?

2017-11-16 17:16:27 回复

白俊遥博客

拉姆 :我也是这个问题

2017-12-07 16:11:15 回复

白俊遥博客

hacker泡泡 :我也是这个问题,大神们,是怎么处理的?

2017-12-28 16:03:21 回复

白俊遥博客

丿Dark丨灬拓 :你好,请问有微信H5支付吗?就是在微信外部的浏览器调用支付的 ?

2017-10-13 10:49:13 回复

白俊遥博客 白俊遥博客

云淡风晴 :我这暂时没有现成整合好的文章教程;

2017-10-16 22:45:43 回复

白俊遥博客

唯丶壹 :你好  我现在在做微信支付  在做公众号支付的时候  我拿到了微信返回给我的prepay_id 但是我调用GetJsApiParameters 这个方法的时候 就会报错  一直找不到原因 

2017-09-19 14:57:27 回复

白俊遥博客

进击的小逗比 :你好,公众号支付做好了嘛,可以教我一下嘛,扣1921227634

2017-10-16 17:04:38 回复

白俊遥博客 白俊遥博客

云淡风晴 :跟着文章走;遇到什么问题了吗?

2017-10-16 22:45:19 回复

白俊遥博客

进击的小逗比 :是的,没有openid的传入

2017-10-16 22:48:21 回复

白俊遥博客

我的电脑 :你好,白神请问一下,如何让付款成功后,跳转到Weixinpay控制器下notify方法带参数过来。public function notify(){ F('test',I('get.')); // 导入微信支付sdk Vendor('Weixinpay.Weixinpay'); $wxpay = new \Weixinpay(); $result = $wxpay->notify(); if ($result){ // 验证成功 修改数据库的订单状态等 $result['out_trade_no']为订单号 F('test2',I('get.'));exit; }}

2017-09-14 17:49:19 回复

白俊遥博客

小陈 :你好 ,请问我按照您博客后 出现invalid out_trade_no 是订单号的错误吗 ?小白求指教

2017-09-13 18:56:34 回复

白俊遥博客

Say:晚安,早安 :你好,为什么我的支付成功后不走notify,没有生成notify.text文件,请问是什么是因为什么呢?

2017-08-24 23:24:01 回复

白俊遥博客

Star。 :你好  公众号支付 出现 JSAPI支付必须传openid   怎么解决啊?

2017-07-31 13:21:37 回复

白俊遥博客

Say:晚安,早安 :你的这个问题解决了吗??求教。

2017-08-24 17:51:09 回复

白俊遥博客

小陈 :+1

2017-09-13 19:09:45 回复

白俊遥博客

进击的小逗比 :亲,搞定了嘛!

2017-10-16 19:04:19 回复

白俊遥博客

鱼.游.游 :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 回复

白俊遥博客

大灰狼 :俊哥,我们这个项目是前后端分开放在两个不同的域名目录下的,然后我就用你这个做了个支付接口。但是调取的过程中,在获取oppenid那个环节会不会前后端的通信就断了,变成微信通过回调url来与我通信了

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 回复

白俊遥博客

大灰狼 :- -,我仔细看了看,知道了code是上面重定向后返回的,但是$data一直没有值不知道为什么。有什么方法能知道吗?手机上面测试也很麻烦

2017-07-11 13:15:22 回复

白俊遥博客 白俊遥博客

云淡风晴 :调试可以用微信开发者工具https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1455784140

2017-07-12 23:20:05 回复

白俊遥博客

大灰狼 :还有就是那个getParameters里面获取code是什么意思啊,在你的调用实例里面不是只传了out_trade_no这个订单号吗

2017-07-11 12:03:51 回复

白俊遥博客

大灰狼 :我点击购买没反应,然后我就跑去输出支付方法里面的$data,发现里面什么都没有是怎么回事啊,然后我是想把他集成到我的TP5里面

2017-07-11 10:53:26 回复

白俊遥博客

大灰狼 :为什么会有生成二维码的函数啊 ?这个微信公众号难道不是在微信内调用网址就能直接跳出支付窗口的吗???

2017-07-10 16:41:13 回复

白俊遥博客 白俊遥博客

云淡风晴 :微信支付现在一共有5种;你说的是公众号支付;除此之外常用的还有app支付和扫码支付;扫码支付需要生成二维码;

2017-07-10 21:24:50 回复

白俊遥博客

梵梵✅ :$result=$this->curl_get_contents($url);            $result=json_decode($result,true);            $openid=$result['openid'];返回都是null   获取不到openid  

2017-07-05 17:12:28 回复

白俊遥博客

Say:晚安,早安 :这个问题解决了吗?我的也是这个问题,,求教

2017-08-24 17:50:11 回复

白俊遥博客

梵梵✅ :测试时显示  jsapi支付必须传openid      需要在此  $url=U('Api/Weixinpay/pay',array('out_trade_no'=>$out_trade_no));  传入吗?

2017-07-04 19:44:19 回复

白俊遥博客

巴乔 :微信支付成功后,异步回调没反应。

2017-06-07 20:19:39 回复

白俊遥博客

Green Forest :回调地址检查下有没错误

2017-07-07 22:17:39 回复

白俊遥博客

ヤんυó恠ɡυΘ魼 :后来调试出来没有,分析一下

2017-07-13 14:47:23 回复

白俊遥博客

多年不上Q :请问一下用vendor引用了类后,错误提示Class 'Weixinpay' not found

2017-06-05 16:29:01 回复

白俊遥博客

有事直说,具体看我签名 :感谢,集成成功,就是发现回调url如果是https就收不到了,http没问题

2017-06-04 20:18:41 回复

白俊遥博客

进击的小逗比 :你好,集成成功了嘛,可以分享代码吗,扣1921227634

2017-10-16 18:22:04 回复

白俊遥博客

最爱 :在weixinpay_js方法里curl获取 $url = U('Api/Weixinpay/pay',array(  'out_trade_no'=>$out_trade_no'),    这个链接返回值怎么是空的啊,确定是get访问的啊,那边pay方法下也获取返回这个了$wxpay->getParameters();

2017-05-23 20:27:16 回复

白俊遥博客

最爱 :redirect($url);时候能拿到数据,只是

2017-05-23 20:29:03 回复

白俊遥博客

Green Forest :为什么我用          $url = U('Api/Weixinpay/pay',array(            'out_trade_no'=>$out_trade_no,            'nonce_str'=>md5('feidao'),            'body'=>'feidao_charge',            'total_fee'=>'0.01',//$meal_val            'trade_type'=>'JSAPI',        ));        // 前往支付        redirect($url);传参数去不到 getParameters方法里

2017-05-18 14:11:20 回复

白俊遥博客

xuli :我想问一下,微信支付页面一刷新就报错是什么问题啊

2017-05-13 09:23:57 回复

白俊遥博客

夏一 :博主你好,在做微信公众号支付的时候,发起支付的时候提示当前页面的URL未注册是什么原因呢?已经在微信公众平台中的微信支付 支付授权目录填写对应的URL了,可是每次发起都报错。

2017-03-30 16:57:47 回复

白俊遥博客

Green Forest :检查下路径

2017-05-18 14:20:12 回复

白俊遥博客

木284 :getParameters方法里的订单,可以通过参数传递,这样里面就不用再处理了。

2017-03-05 16:37:54 回复

白俊遥博客

嗓音少了许多 :你好,支付成功之后没有走notify的流程,也没有生成notify.txt文件,请问是什么原因?

2017-03-02 11:58:26 回复

白俊遥博客

彼岸的命運╰ :白大神,请教一下,微信支付调用的url为:

2017-02-24 00:02:54 回复

白俊遥博客

彼岸的命運╰ :白大神,请教一下,微信支付调用的url为:

2017-02-24 00:02:52 回复

白俊遥博客

°~~ :5555555

2017-02-22 17:10:42 回复

白俊遥博客

MarsTang :JSAPI支付必须传openid  出现这个,是我哪里配置错了吗?

2017-02-20 16:23:37 回复

白俊遥博客

halo :你好,请问IndexController控制器里weixinpay_js 方法是要从移动到WeixinpayController里吗?如果不移动,那应该不能调用生成订单自己的订单号了吧?

2017-01-20 16:12:29 回复

白俊遥博客 白俊遥博客

云淡风晴 :不需要移动;get传参过去就可以;

2017-01-28 21:21:04 回复

白俊遥博客

halo :那weixinpay_js 方法是在哪里被调用执行的呢??

2017-02-06 10:00:30 回复

白俊遥博客

曲終人散 :老师,能发一份么,正在学习微信支付这块,谢谢了。88525397@qq.com

2017-01-19 12:05:23 回复

白俊遥博客

PikaChu :感谢白神,可以加QQ吗大神

2017-01-16 16:56:25 回复

白俊遥博客

吴伟祥 白俊遥博客很厉害

2017-01-13 13:56:37 回复

白俊遥博客

奕雨titi :技术还是挺牛的!

2017-01-12 11:47:00 回复

白俊遥博客

奕雨titi 白俊遥博客xss的过滤  你是怎么做的?

2017-01-12 11:18:15 回复

白俊遥博客

奕雨titi :window.alert=function(a){return;}试试看

2017-01-12 11:49:52 回复

白俊遥博客 白俊遥博客

云淡风晴 :多谢测出来的bug;

2017-01-12 13:10:56 回复

白俊遥博客

奕雨titi :更新有的blog 代码 有没有,发我一份吧 jockers@qq.com

2017-01-12 14:22:51 回复

白俊遥博客 白俊遥博客

云淡风晴 :已发;

2017-01-15 11:50:52 回复

白俊遥博客

Mr、han :您好,老师。我想直接访问在pay.html,在pay.html用AJAX提交金额等信息,应该怎么处理?ajax应该提交到哪个控制器啊

2017-01-03 14:15:39 回复

白俊遥博客 白俊遥博客

云淡风晴 :自己建个;获取$wxpay->getParameters();

2017-01-07 11:52:54 回复

白俊遥博客

........... :老师  根据你的流程做  在IndexController控制器下 weixinpay_js()方法里面改成了自己的订单  然后在WeixinpayController里面看到你写了一句话/**     * 公众号支付 必须以get形式传递 out_trade_no 参数     * 示例请看 /Application/Home/Controller/IndexController.class.php     * 中的weixinpay_js方法     */这里需要把订单号传递到哪里去

2016-12-27 17:24:47 回复

白俊遥博客 白俊遥博客

云淡风晴 :传到Api/Weixinpay/pay;

2017-01-02 14:10:37 回复

白俊遥博客

Mr、han :能问你几个问题吗 方便加下QQ吗

2017-01-03 14:16:31 回复

白俊遥博客

........... :你好  首先感谢你的分享!!想请教你一下   我的支付也成功了  但是为什么notify这个页面一直没有走

2016-12-27 11:29:50 回复

白俊遥博客 白俊遥博客

云淡风晴 :看是否生成了notify.text文件;

2017-01-02 14:09:50 回复

白俊遥博客

㊣╭(╯_╰)╭路过 :你好,我也遇到这个问题了,文件生成了里面是空的[],

2017-01-03 21:40:23 回复

白俊遥博客

唐三藏 :老师,点击pay.html页面中购买后,没有反应是什么情况,getorder()函数已补全

2016-12-19 11:09:26 回复

白俊遥博客 白俊遥博客

云淡风晴 :看下js报什么错了么?

2016-12-22 22:55:39 回复

白俊遥博客

河边草 :notify方法$dingdanhao    =  mb_substr($result['out_trade_no'], 0 , 17);$xiugai = M('order')->where(array("order"=>$dingdanhao))->setField('state',1);数据库没反应

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 回复

白俊遥博客

就这样“ i”了 :'NOTIFY_URL'         => 'http://milejia.wz-kj.cn/Api/Weixinpay/notify', // 接收支付状态的连接我的接收支付链接是这个,但是支付完成没有任何反应,我是按照你这个支付来做的,是不是只用改这个链接,然后在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             }}这个方法这修改订单状态,还需要填什么东西吗?

2016-12-05 13:10:03 回复

白俊遥博客 白俊遥博客

云淡风晴 :接收到通知;改订单状态就行了;

2016-12-05 23:04:06 回复

白俊遥博客

河边草 :支付成功后不能跳转到notify

2016-12-12 14:26:14 回复

白俊遥博客

........... :你的搞好了吗

2016-12-27 13:46:55 回复

白俊遥博客

嗓音少了许多 :你的做好了吗?

2017-03-02 11:59:45 回复

白俊遥博客

张一丁 :加个qq呗

2016-11-28 16:49:19 回复

白俊遥博客

Mr.Insight :我是osc上的吾字天河哦......过来看看你的blog  学习  学习

2016-11-19 18:55:45 回复

白俊遥博客 白俊遥博客

云淡风晴 :多谢捧场;

2016-12-05 23:02:38 回复

白俊遥博客

杨小刚 白俊遥博客看你博客都半年了 以前一个账号丢了 

2016-11-14 10:59:15 回复

白俊遥博客 白俊遥博客

云淡风晴 :多谢捧场;

2016-11-15 23:43:35 回复

白俊遥博客

(͡·̮̃·̃) :在notify方法判断返回是否成功吗 为什么在那下面写插入数据库的业务逻辑的时候有几个人会有插入两条的情况呢,两条订单号是一个 所以只是支付一次 为什么插入数据库两次呢

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 回复

白俊遥博客

无法埋名 :'NOTIFY_URL'         => 'http://www.xxx.com/index.php/Api/WeixPay/notify', // 接收支付状态的连接~~~~~为什么接不到通知呢?

2016-11-10 08:03:40 回复

白俊遥博客 白俊遥博客

云淡风晴 :生成notify.text文件了么?

2016-11-10 22:52:36 回复

白俊遥博客

无法埋名 白俊遥博客是WeixinPay 不是WeixPay

2016-11-11 14:00:35 回复

白俊遥博客

Green Forest :我改成WeixinPay 还是不能生成notify.text 也传不到值 你解决了吗?

2017-07-07 22:14:26 回复

白俊遥博客 白俊遥博客

云淡风晴 :先检查是否有写权限;

2017-07-10 21:32:42 回复

白俊遥博客

无法埋名 :请问楼主,,,,为什么/ThinkPHP/Library/Vendor/Weixinpay/Weixinpay.php 的getParameters方法里 将订单信息写入数据库写入不了呢??????????M('Orders')->add(array( 'order_no' => $out_trade_no, 'subject' => $order['body'], 'total_fee' => $order['total_fee'], 'ctime' => time(), ));

2016-11-09 18:19:55 回复

白俊遥博客

无法埋名 :是我配置错数据库了(我安装的时候老是提示数据库链接错误,只好自己导入sql了,然后建了个db.php文件自己配置)

2016-11-09 19:10:38 回复

白俊遥博客

-_-# :请问支付二维码,怎么弄呢

2016-11-07 10:19:34 回复

白俊遥博客 白俊遥博客

云淡风晴 :http://baijunyao.com/article/77

2016-11-07 22:46:37 回复

白俊遥博客

Lait-憧憬 白俊遥博客 if(res.err_msg == "get_brand_wcpay_request:ok" ) {   这里有问题的!! 复制官方的代码那个冒号:是中文的冒号!要改为英文的冒号才行~坑了我也好久!!

2016-10-22 14:58:58 回复

白俊遥博客 白俊遥博客

云淡风晴 :多谢提醒;已更改;

2016-10-23 09:48:55 回复

白俊遥博客

极致feng行新 :请先登陆后发表评论你好,非常感谢,,,整合了TP后发现异步接收通知不起作用,,,支付成功后根本没有调用notify_url接收页面

2016-10-05 02:11:50 回复

白俊遥博客 白俊遥博客

云淡风晴 :NOTIFY_URL填写对;是会走的;不过这个过程是看不见的;

2016-10-09 07:20:11 回复

白俊遥博客

蜗牛 :我们公司微信支付总有客户反映支付失败,我们测试没问题,后来问的微信那边的人看日志说是prepayid为空,好像签名什么的有问题,但是我们测试一切都正常,很急,这是怎么回事

2016-09-21 22:24:29 回复

白俊遥博客 白俊遥博客

云淡风晴 :是否是重复支付一个订单号?

2016-10-09 07:20:44 回复

白俊遥博客

4暮 :请问下你这有没有wap站H5支付集成的微信支付呢

2016-09-19 16:26:58 回复

白俊遥博客 白俊遥博客

云淡风晴 :没有wap站的支付的;

2016-09-19 21:57:45 回复

白俊遥博客

壞壞、、 :建议在完善一下,源码很好用,写的也很清晰,就是功能太少了 ,查询订单  红包  退款等等加上就好了  

2016-09-18 04:02:55 回复

白俊遥博客 白俊遥博客

云淡风晴 :恩恩;过后慢慢完善了;

2016-09-18 22:43:43 回复

白俊遥博客

快乐的刘扬 :get_brand_wcpay_request:ok  群主你这里写错了.5555555害我弄好久

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 回复

白俊遥博客

快乐的刘扬 :请问,支付成功后,为什么前端的js回调没有成功

2016-09-14 16:39:20 回复

白俊遥博客

守护幸福 :已经解决了。是curl_get_contents这个函数的问题,在网上又找了一个,可以用了。

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 回复

白俊遥博客

守护幸福 :使用了你的整合教程,我也遇到了个很奇怪的问题,虽然把curl_get_contents代码复制进公共函数中了,但是在获取OPENID的时候,一直获取不到。不知道是什么问题引起的。总是返回NULL。生成的URL参数直接访问,可以得出JSON的数据,但是就是curl_get_contents($res)这行代码一直返回NULL。

2016-09-12 12:53:57 回复

白俊遥博客

Fighting Man :你好,谢谢你的分享,但是我也遇到了一个问题就是,只要把totalfee修改为不是1的数就不能支付,提示调用jsapi缺少参数$key0$

2016-09-11 23:34:46 回复

白俊遥博客 白俊遥博客

云淡风晴 :查看下是否是订单重复支付?

2016-09-12 21:56:30 回复

白俊遥博客

厦门_xu2026 :totalfee不为1的时候,prepay_id为空,就不能支付了,到现在都没解决吗?

2016-10-06 11:11:19 回复

白俊遥博客 白俊遥博客

云淡风晴 :那是重复支付了一个订单号的症状;订单号要保证唯一;切不能重复支付;

2016-10-09 07:22:18 回复

白俊遥博客

Player I :你好 读了你的文章受益匪浅 但是在实际使用中有几个问题希望能得到你的解答$order数组我修改body和total_fee为test和1 以外的值就无法完成支付,打开页面微信支付的窗口一闪而过

2016-09-07 16:51:09 回复

白俊遥博客

Player I :2.还有一个疑问 $out_trade_no = I('get.state', 0, 'intval'); 这个$_GET['state']参数是什么?

2016-09-07 16:57:58 回复

白俊遥博客 白俊遥博客

云淡风晴 :换一个订单号;再支付试试?

2016-09-07 23:48:22 回复

白俊遥博客 白俊遥博客

云淡风晴 :$_GET['state'] 就是订单号;

2016-09-07 23:49:31 回复

白俊遥博客

香蕉你个banana 白俊遥博客大神,跪求一篇关于微信开发的帖子

2016-09-06 14:30:33 回复

白俊遥博客 白俊遥博客

云淡风晴 :后期有空可以整理;

2016-09-06 23:35:37 回复

白俊遥博客

白。 :白老师,新手这里求助,我这里C方法获取不到WEIXINPAY_CONFIG的配置参数,同时getparameters方法中的$config会报未定义变量的错误

2016-09-06 11:26:59 回复

白俊遥博客 白俊遥博客

云淡风晴 :在别的地方C函数可以使用吗?

2016-09-06 23:35:13 回复

白俊遥博客

switch多了些break :没有看到cert文件夹的文件在哪有调用啊 

2016-09-05 22:33:01 回复

白俊遥博客 白俊遥博客

云淡风晴 :恩恩;支付没有用到;后续补充的其他操作会用到;

2016-09-05 22:44:38 回复

白俊遥博客

switch多了些break :跳转至pay界面的时候微信支付的提示一闪而过,提示支付失败  没有找到原因

2016-09-06 17:13:09 回复

白俊遥博客

switch多了些break :真如“博美云-胡工”所说的 最好加上 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 回复

白俊遥博客

4暮 :wexinpay_js 能否在这个方法下直接调用起支付。而不是跳转到pay页面

2016-09-01 19:08:05 回复

白俊遥博客 白俊遥博客

云淡风晴 :可以的;把js封装成一个函数;然后调用函数就可以了;

2016-09-01 22:14:59 回复

白俊遥博客

box :你好,请问一下你的pay.html中的getOrder()方法是在哪里实现的?求指导

2016-08-28 10:55:41 回复

白俊遥博客 白俊遥博客

云淡风晴 :恩恩;谢谢提醒;我在文中注明下;现在是默认进入页面后直接就弹出支付;如果想点击按钮支付;那写一个getOrder的函数;把pay.html中的js整个放在getOrder函数中即可;

2016-08-28 18:11:38 回复

白俊遥博客

韩小明 :非常感谢分享代码,以后会有帮助。

2016-08-25 18:48:13 回复

白俊遥博客

頖亂灬 :你好,我按照你的教程整合到tp里面去,但支付成功之后,不会回调回来,找了很久找不到原因的

2016-08-25 17:08:19 回复

白俊遥博客 白俊遥博客

云淡风晴 :html中的js部分是有接受支付成功后的方法的;

2016-08-25 23:48:19 回复

白俊遥博客

黑白蓝 :这个必须过来赞一个,你的开源项目给了大家很大的参考帮助,让人少踩很多坑,非常感谢!望继续集成更多实用的东西,加油!!

2016-08-17 23:47:31 回复

白俊遥博客 白俊遥博客

云淡风晴 :谢谢支持;

2016-08-18 00:04:14 回复

白俊遥博客

卡兰多 :真的非常实用,分享的技术文章明朗清晰,感谢你所带来的付出和帮助,非常感谢

2016-08-20 17:24:06 回复

白俊遥博客

博美云-胡工 :我跟踪调试,发现是getParameters()函数的$result=curl_get_contents($url)返回值是false,但是$url我输出的结果是对的,然后下一句$result=json_decode($result,true); 这句的返回值是null,我怀疑问题出在这里。。

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 回复

白俊遥博客

博美云-胡工 :"https://api.weixin.qq.com/sns/oauth2/access_token?appid=**********&secret=**********&code=**********&grant_type=authorization_code"

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 回复

白俊遥博客

博美云-胡工 :你好,俊哥,我调试出pay界面了,出pay界面的时候的有个微信支付的提示一闪而过,然后在pay界面点击购买无任何反应了,找不出哪里的问题了..

2016-08-14 08:28:29 回复

白俊遥博客

二哥有点潮 :还是没怎么明白怎么弄?

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

白俊遥博客

盘古网络_张书伟 :file_get_contents('php://input', 'r') 这个php://input 是什么意思啊

2016-08-08 14:43:21 回复

白俊遥博客 白俊遥博客

云淡风晴 :http://php.net/manual/zh/wrappers.php.php

2016-08-08 18:23:50 回复

白俊遥博客

☀☀☀☀☀☀ :bjyadmin.bjy_users' doesn't exist 而且index.php界面很简陋,好像没CSS的样子

2016-08-08 11:53:14 回复

白俊遥博客 白俊遥博客

云淡风晴 :在哪个地方报的这个错?额;事实上却是没有css;

2016-08-08 18:23:04 回复

白俊遥博客

~ :你好,请问公众号支付是否支持子域名,我按照你的设置老是提示 “AppID 参数错误”config里面的参数都是按照实际设置的,支付授权目录和域名都设置了,只不过我的是子域名 demo.xxx.com,不知道是不是这原因

2016-08-06 09:24:16 回复

白俊遥博客 白俊遥博客

云淡风晴 :你微信后台中设置的域名是子域名还是顶级域名?

2016-08-07 21:14:52 回复

白俊遥博客

Sun :我也碰到这个问题,参数核对过,确认无误。我也是用的子域名,网页授权的域名是顶级域名,获取code是通过顶级域名下的一个中间文件获取的,流程是子域名下的程序访问顶级域名下的该文件,该文件获取code返回给子域名下的程序,然后再拿code换openid,openid是可以获取到的,但是现在支付时就报缺少参数:appId get_brand_wcpay_request:fail....

2017-01-12 16:28:21 回复

白俊遥博客

Pmd :最近项目中用到的很多东西都是从你这里找到了方向!谢谢 嘿嘿

2016-07-28 11:03:46 回复

白俊遥博客

Frances :代码和方法都特别有帮助,跪等APP接微信支付白俊遥博客

2016-07-19 16:01:10 回复

白俊遥博客 白俊遥博客

云淡风晴 :谢谢;有的;第五步的这个异步接收通知就可以对接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 回复