扫码微信开发中的一些事
来源:互联网 发布:手机淘宝查看卖家电话 编辑:程序博客网 时间: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重连了一下,然后更改了数据,前台一直侦测数据是否有更改即可完成效果。
最终还是搞定了,写此文从中得以总结和提升
- 扫码微信开发中的一些事
- Android开发SDK过程中的一些事
- 开发中的一些问题
- J2ME开发中的一些问题
- 一些Java开发中的异常
- 项目中的一些开发规则
- 一些开发中的css问题
- wince 开发中的一些误区
- 嵌入式开发中的一些细节
- 蓝牙开发中的一些问题
- 文件系统开发中的一些总结。
- .NET开发中的一些技巧
- 软件开发中的一些英语词汇
- 项目开发中的一些体会
- Web开发中的一些基础知识
- LAMP开发中的一些知识点
- 软件开发中的一些感想
- Teamcenter 开发中的一些问题
- poj Stall Reservations(贪心)
- 从零开始开发一款Android App
- vi 常用命令
- android开发之四种基本布局
- Service基础
- 扫码微信开发中的一些事
- window.open详解
- php 支持断点续传的文件下载类
- Android新特性介绍,ConstraintLayout完全解析
- Java编译后产生class文件的命名规则
- C++Primer拾遗
- 一道让你轻松搞定Java面向对象方法
- 1255 字典序最小的子序列
- apache shiro使用nginx集群如何解决cache共享