扫码微信开发中的一些事

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

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

相关信息:

1.选择的扫码模式二;

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

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

开始介绍开发过程:

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

<?php
namespace 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,对,就是那个比较奇葩的版本,不过个人感觉性能不错)

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

扫描二维码关注公众号,回复: 2911201 查看本文章
$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重连了一下,然后更改了数据,前台一直侦测数据是否有更改即可完成效果。

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

猜你喜欢

转载自blog.csdn.net/th_php/article/details/75669598
今日推荐