PHP 接入微信扫码支付总结(总结篇)


Posted in PHP onNovember 03, 2016

PHP 接入微信扫码支付总结(总结篇)

PHP 接入微信扫码支付总结(总结篇)

PHP 接入微信扫码支付总结(总结篇)

PHP 接入微信扫码支付总结(总结篇)

PHP 接入微信扫码支付总结(总结篇)

微信扫码支付分为两种模式,

模式一比较复杂,需要公众号配置回调地址。

模式二比较简单,只需要在代码中配置回调地址就可以了。

我这次使用的是模式二。

需要配置参数,

const APPID = 'xxx';
const MCHID = 'xxx';
const KEY = 'xxx';
const APPSECRET = 'xxx';

配置公众号的appid,appsecret。以及微信支付的mchid与key。

生成二维码,这个页面需要自己去美化,不像支付宝那样自带效果。

require_once "./phpcms/plugin/weixinpay/lib/WxPay.Api.php";
require_once "./phpcms/plugin/weixinpay/example/WxPay.NativePay.php";
require_once './phpcms/plugin/weixinpay/example/log.php';
$input = new WxPayUnifiedOrder();
$input->SetBody('预订'.$product_info['name'].'订单');
$input->SetAttach('预订'.$product_info['name'].'订单');
$input->SetOut_trade_no($order_info['orderno']);
$input->SetTotal_fee($order_info['payprice'] * 100);
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
$input->SetGoods_tag("");
$input->SetNotify_url("http://www.ayuanduanzu.com/wxpay/notify.php"); // 地址是外网能访问的,且不能包含参数
$input->SetTrade_type("NATIVE");
$input->SetProduct_id($product_info['id']);
$notify = new NativePay();
$result = $notify->GetPayUrl($input);
$code_url = $result["code_url"];
<img alt="扫码支付" src="http://paysdk.weixin.qq.com/example/qrcode.php?data={urlencode($code_url)}" style="width:150px;height:150px;"/>

这里的回调地址很有讲究,扫码支付成功后,微信会自动调用这个地址。这个地址不能包含任何参数,否则调用失败。啥都看不到!

微信调用的时候,会传递xml类型的参数。

include_once "../phpcms/base.php";
// 处理回调数据
error_reporting(E_ERROR);
require_once "../phpcms/plugin/weixinpay/lib/WxPay.Api.php";
require_once '../phpcms/plugin/weixinpay/lib/WxPay.Notify.php';
require_once '../phpcms/plugin/weixinpay/example/log.php';
//初始化日志
$logHandler= new CLogFileHandler("../logs/".date('Y-m-d').'.log');
$log = Log::Init($logHandler, 15);
class PayNotifyCallBack extends WxPayNotify
//查询订单
public function Queryorder($transaction_id)
{
$input = new WxPayOrderQuery();
$input->SetTransaction_id($transaction_id);
$result = WxPayApi::orderQuery($input);
Log::DEBUG("query:" . json_encode($result));
if(array_key_exists("return_code", $result)
&& array_key_exists("result_code", $result)
&& $result["return_code"] == "SUCCESS"
&& $result["result_code"] == "SUCCESS")
{
return true;
}
return false;
}
//重写回调处理函数
public function NotifyProcess($data, &$msg)
{
Log::DEBUG("call back:" . json_encode($data));
$notfiyOutput = array();
if(!array_key_exists("transaction_id", $data)){
$msg = "输入参数不正确";
return false;
}
//查询订单,判断订单真实性
if(!$this->Queryorder($data["transaction_id"])){
$msg = "订单查询失败";
return false;
}
return true;
}
Log::DEBUG("begin notify");
$notify = new PayNotifyCallBack();
$ilog_db = pc_base::load_model('ilog_model');
$order_db = pc_base::load_model('order_model');
$postXml = $GLOBALS["HTTP_RAW_POST_DATA"];
$postArr = xmlToArray($postXml);
// 查询是否支付成功
$r = $notify->Queryorder($postArr['transaction_id']);
if ($r) {
// 获取订单信息
$order_info = $order_db->get_one(array('orderno'=>$postArr['out_trade_no']));
if ($order_info['pay_status'] != '1') {
$data['pay_status'] = '1';
$data['pay_type'] = 'weixinpay';
$data['pay_code'] = $postArr['transaction_id'];
$data['paytime'] = time();
$data['order_status']= 3; // 已支付
$order_db->update($data,array('orderno'=>$postArr['out_trade_no']));
}
?>

通过

$GLOBALS["HTTP_RAW_POST_DATA"];

可以获取微信端传入的参数

{
"appid": "wxed7996e9ad58345d",
"attach": "u9884u8ba2u5bbfu8fc1u00b7u592au53e4u91ccu7f8eu5f0fu5957u623fu8ba2u5355",
"bank_type": "CFT",
"cash_fee": "1",
"fee_type": "CNY",
"is_subscribe": "Y",
"mch_id": "1283301801",
"nonce_str": "20xn5e0lbk2u1u6pes2uonape2sdyfs4",
"openid": "oR8C7wsknwVELIRrzTlZX2eONWeY",
"out_trade_no": "2016091455521024608",
"result_code": "SUCCESS",
"return_code": "SUCCESS",
"sign": "95C2C532D095E7BF7588522C579758C4",
"time_end": "20160914135518",
"total_fee": "1",
"trade_type": "NATIVE",
"transaction_id": "4009602001201609143926590576"
}

查询是否已支付,支付完成的话,进行订单数据处理。

这里的一切都是异步的,二维码页面啥都看不到。

只能通过异步获取订单状态来判断是否操作成功。

// 检测是否支付成功
$(document).ready(function () {
setInterval("ajaxstatus()", 3000); 

function ajaxstatus() {
var orderno = $("#out_trade_no").val();
if (orderno != 0) {
$.ajax({
url: "?m=home&c=order&a=ajax",
type: "GET",
dataType:"json",
data: {
todo: 'ajaxCheckWxPay',
orderno: orderno,
},
success: function (json) {
if (json.status == 1) { //订单状态为1表示支付成功
layer.msg('支付成功',{icon:1,time: 2000},function(){
window.location.href = "?m=home&c=order&a=payDone&orderno="+json.info['orderno'];
});
// window.location.href = "wxScanSuccessUrl.action"; //页面跳转
}
}
});
}
}

三秒执行一次,如果成功,进行跳转处理。

赠送函数

* 作用:array转xml
*/
function arrayToXml($arr)
$xml = "<xml>";
foreach ($arr as $key=>$val)
{
if (is_numeric($val))
{
$xml.="<".$key.">".$val."</".$key.">"; 
}
else
$xml.="<".$key."><![CDATA[".$val."]]></".$key.">"; 
}
$xml.="</xml>";
return $xml; 

* 作用:将xml转为array
*/
function xmlToArray($xml)
{ 
//将XML转为array 
$array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); 
return $array_data;
}

赠送小窍门

对于异步的调用,如果看不到效果。可以建一个日志表,把操作的数据记录在表中。便于测试。支付回调都是异步的,可以通过日志表中的数据来判断是否支付成功,是否调用了回调,调用了几次。

小结:

微信扫码支付不如支付宝扫码支付便捷。需要自己做很多处理。

以上所述是小编给大家介绍的PHP 微信扫码支付接入总结(总结篇),数据库显示空白的完美解决方案(图文教程),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
JAVA/JSP学习系列之四
Oct 09 PHP
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
Jun 08 PHP
str_replace只替换一次字符串的方法
Apr 09 PHP
深入分析PHP引用(&amp;)
Sep 04 PHP
php 利用socket发送HTTP请求(GET,POST)
Aug 24 PHP
yii2中添加验证码的实现方法
Jan 09 PHP
PHP 将dataurl转成图片image方法总结
Oct 14 PHP
Joomla框架实现字符串截取的方法示例
Jul 18 PHP
thinkPHP5实现数据库添加内容的方法
Oct 25 PHP
搜索附近的人PHP实现代码
Feb 11 PHP
Laravel框架生命周期与原理分析
Jun 12 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
Feb 11 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
Nov 03 #PHP
PHP 微信扫码支付源代码(推荐)
Nov 03 #PHP
php使用正则表达式去掉html中的注释方法
Nov 03 #PHP
使用正则去除php代码中的注释方法
Nov 03 #PHP
php cookie 详解使用实例
Nov 03 #PHP
PHP使用curl制作简易百度搜索
Nov 03 #PHP
php 防止表单重复提交两种实现方法
Nov 03 #PHP
You might like
咖啡的种类和口感
2021/03/03 新手入门
PHP编程获取音频文件时长的方法【基于getid3类】
2017/04/20 PHP
网页的标准,IMG不支持onload标签怎么办
2006/06/29 Javascript
utf8的编码算法 转载
2006/12/27 Javascript
基于Jquery的$.cookie()实现跨越页面tabs导航实现代码
2011/03/03 Javascript
JavaScript高级程序设计(第3版)学习笔记4 js运算符和操作符
2012/10/11 Javascript
JS+CSS实现下拉列表框美化效果(3款)
2015/08/15 Javascript
基于Node.js实现nodemailer邮件发送
2016/01/26 Javascript
JavaScript里 ==与===区别详解
2016/08/16 Javascript
使用puppeteer破解极验的滑动验证码
2018/02/24 Javascript
vue动态路由配置及路由传参的方式
2018/05/23 Javascript
JS判断用户用的哪个浏览器实例详解
2018/10/09 Javascript
mpvue 单文件页面配置详解
2018/12/02 Javascript
Django+Vue实现WebSocket连接的示例代码
2019/05/28 Javascript
Vue 实现html中根据类型显示内容
2019/10/28 Javascript
vue中音频wavesurfer.js的使用方法
2020/02/20 Vue.js
[02:06]2018完美世界全国高校联赛秋季赛开始报名(附彩蛋)
2018/09/03 DOTA
状态机的概念和在Python下使用状态机的教程
2015/04/11 Python
django项目搭建与Session使用详解
2018/10/10 Python
python 返回列表中某个值的索引方法
2018/11/07 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
Python+OpenCV实现将图像转换为二进制格式
2020/01/09 Python
wxpython自定义下拉列表框过程图解
2020/02/14 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
matplotlib.pyplot.matshow 矩阵可视化实例
2020/06/16 Python
Python 分布式缓存之Reids数据类型操作详解
2020/06/24 Python
python为什么要安装到c盘
2020/07/20 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
Melissa鞋马来西亚官方网站:MDreams马来西亚
2018/04/05 全球购物
科茨沃尔德家居商店:Scotts of Stow
2018/06/29 全球购物
地方白酒代理协议书
2014/10/25 职场文书
什么是执行力?9个故事告诉您:成功绝非偶然!
2019/07/05 职场文书
python爬取企查查企业信息之selenium自动模拟登录企查查
2021/04/08 Python
MySQL 视图(View)原理解析
2021/05/19 MySQL
Pandas加速代码之避免使用for循环
2021/05/30 Python
Python实现猜拳与猜数字游戏的方法详解
2022/04/06 Python