扫码微信开发中的一些事

来源:互联网 发布:手机淘宝查看卖家电话 编辑:程序博客网 时间:2024/06/04 00:56

今天忙活了一天,总算完成项目上的微信开发接口对接

看上去挺简单的一个事情,因为有些坑没踩过,所以就进度非常慢,这里主要说说微信扫码开发中的一些坑,和我的开发过程:

相关信息:

1.选择的扫码模式二;

2.为了让其DEMO在自己机子上以LOCALHOST域名跑起来,改了一个DEMO文件,这个只是为了测试而已,不赘述;

3.项目使用的THINKPHP5开发的,所以对于这种第三方类的引入就是第一个坑点

开始介绍开发过程:

1.我将如下文件(都是有关于扫码模式二的)放入了APPLICATION下面的API下的Wxpay这里去:
这里写图片描述
2.在TP对应的Orders控制器中我是这么引入的相关文件:

<?phpnamespace app\Home\controller;use think\Controller;use think\Session;use think\Request;require_once "../application/Api/Wxpay/WxPay.Config.php";require_once "../application/Api/Wxpay/WxPay.Api.php";require_once "../application/Api/Wxpay/WxPay.Data.php";require_once "../application/Api/Wxpay/WxPay.NativePay.php";require_once '../application/Api/Wxpay/log.php';//前台订单控制类class Orders extends Controller {

3.我在微信请求模块是这么用的第三方类:

 $input = controller('Api/WxPayUnifiedOrder'); $WxPayConfig = controller('Api/WxPayConfig'); $notify = controller('Api/NativePay'); $random = mt_rand(1000,5000); //随机的微信支付标签ID $input->SetBody("XXX服务项目"); $input->SetAttach(implode("|",$orders)); $input->SetOut_trade_no($WxPayConfig::MCHID.date("YmdHis")); $input->SetTotal_fee("1"); $input->SetTime_start(date("YmdHis")); $input->SetTime_expire(date("YmdHis", time() + 600)); $input->SetGoods_tag("XXXXX"); $input->SetNotify_url("http://XXXX.com/Payout.html"); $input->SetTrade_type("NATIVE"); $input->SetProduct_id($random); $result = $notify->GetPayUrl($input); $url = $result["code_url"]; $this->assign('URL',urlencode($url)); $this->assign('Orders',$orders); $this->assign('Orders_js',json_encode($orders)); return $this->fetch('Wx');

(请注意,我使用的是TP5,对,就是那个比较奇葩的版本,不过个人感觉性能不错)

写到了这里,我就开始我的第一个大坑了,我在相应页面的确生成了我想要的二维码图片,然后我又做了个回调函数,也就是说当时的配置中,微信第三方类的这个方法我用的是:

$input->SetNotify_url("http://XXXX.com/index.php/Home/Orders/payout");

上面的伪静态当时对应的解析就是这样的,也就是让微信访问我Orders控制器下面的payout方法,然而我不论怎么调试都是没有访问到这个方法,我在网上搜索很久,也没查出来,比如:不能带参数之类的,后来我才知道是,微信只能访问根目录下面的一个文件,也就是说它刚刚一直在访问的是index.php罢了。

真无语,于是我改了伪静态让它开始访问我的payout.php。
当时的payout.php内容应该是直接用函数将微信返回的XML文件写到本地文件上去,证明其成功返回。
成功返回后我非常开心,但是我发现支付后是不能自动跳转的,也就是说必须自己写这个回调,于是写就写吧:

4.处理回调的XML文件(payout.php内容)

$xml =  trim(file_get_contents('php://input')); //返回的xml       //微信支付后回调信息处理$xmlObj = simplexml_load_string($xml);$xmlArr = get_object_vars($xmlObj);$orders = $xmlArr['attach']; //订单号$result_code = $xmlArr['result_code']; //状态if($result_code == 'SUCCESS')  {   //数据库操作    $dbms='mysql';     //数据库类型    $host='localhost'; //数据库主机名    $dbName='XXX';    //使用的数据库    $user='root';      //数据库连接用户名    $pass='XXX';          //对应的密码    $dsn="$dbms:host=$host;dbname=$dbName";    $orders = explode("|",$orders);    $mysql = new PDO($dsn, $user, $pass); //初始化一个PDO对象    foreach ($orders as $key => $order) {        $sql = "UPDATE `ws_Orders` SET Orders_station = 1 WHERE Orders_id = '$order'";        $mysql->exec($sql);        }           }    else{      header('Location:filedpay.html');//失败    }

说实话上面这个文件处理居然花了我两小时处理,我最开始的时候是不想在单独文件里面重连数据库,毕竟我现在是在TP框架里面啊,于是我想能不能

header('Location:http://XXXXX.html/payed.html');

而且我还可以传递参数对吧?
但是我发现,不论是带参还是无参都是不能访问,这个方法废除!

于是我又想能不能通过SESSION方法呢,在订单创建的时候给他单独分配一个SESSSION 然后在微信回调后再给这个SESSION赋值,前台创建一个AJAX一直侦查这个SESSION值,这样不就也能达到比较好效果了吗?

于是我说做就做,(错误代码不贴了)结果做到后面一半的时候,我突然记起来,微信访问的时候是用的另外一个SESSIONID 不是同一个SESSION啊,如果要控制它们保持一致也不是不行,但是那样也太浪费时间了吧,于是我就放弃了这个方法,本来还想引入框架文件来调用框架中的MODEL等方法,但是才发现,这特么根本不行。

最后还是屈服于自己的弱小智短,写了一个PDO重连了一下,然后更改了数据,前台一直侦测数据是否有更改即可完成效果。

最终还是搞定了,写此文从中得以总结和提升

原创粉丝点击