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 相关文章推荐
PHP截取汉字乱码问题解决方法mb_substr函数的应用
Mar 30 PHP
php数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
Oct 31 PHP
php中使用addslashes函数报错问题的解决方法
Feb 06 PHP
实测在class的function中include的文件中非php的global全局环境
Jul 15 PHP
九个你必须知道而且又很好用的php函数和特点
Aug 08 PHP
MyEclipse常用配置图文教程
Sep 11 PHP
PHP答题类应用接口实例
Feb 09 PHP
PHP生成json和xml类型接口数据格式
May 17 PHP
PHP环形链表实现方法示例
Sep 15 PHP
php实现的后台表格分页功能示例
Oct 23 PHP
laravel 数据迁移与 Eloquent ORM的实现方法
Apr 12 PHP
PHP实现本地图片转base64格式并上传
May 29 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
PHP的宝库目录--PEAR
2006/10/09 PHP
PHP中防止SQL注入实现代码
2011/02/19 PHP
php简单统计字符串单词数量的方法
2015/06/19 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
2015/12/31 PHP
PHP正则删除HTML代码中宽高样式的方法
2017/06/12 PHP
javascript下查找父节点的简单方法
2007/08/13 Javascript
一个可以兼容IE FF的加为首页与加入收藏实现代码
2009/11/02 Javascript
Firefox+FireBug使JQuery的学习更加轻松愉快
2010/01/01 Javascript
基于jquery插件制作左右按钮与标题文字图片切换效果
2013/11/07 Javascript
Java/JS获取flash高宽的具体方法
2013/12/27 Javascript
js和jquery中循环的退出和继续学习记录
2014/09/06 Javascript
node.js中的http.response.removeHeader方法使用说明
2014/12/14 Javascript
举例讲解JavaScript substring()的使用方法
2015/11/09 Javascript
JavaScript实现瀑布流以及加载效果
2017/02/11 Javascript
微信小程序slider组件使用详解
2018/01/31 Javascript
为vue项目自动设置请求状态的配置方法
2019/06/09 Javascript
vue实现二级导航栏效果
2019/10/19 Javascript
JS实现秒杀倒计时特效
2020/01/02 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
Vue+element+cookie记住密码功能的简单实现方法
2020/09/20 Javascript
js实现碰撞检测
2021/01/29 Javascript
详解django中自定义标签和过滤器
2017/07/03 Python
Python网络编程详解
2017/10/31 Python
详解用Python处理HTML转义字符的5种方式
2017/12/27 Python
Django后台获取前端post上传的文件方法
2018/05/28 Python
python使用response.read()接收json数据的实例
2018/12/19 Python
python实现自动化上线脚本的示例
2019/07/01 Python
Python中 CSV格式清洗与转换的实例代码
2019/08/29 Python
如何利用Python开发一个简单的猜数字游戏
2019/09/22 Python
python 错误处理 assert详解
2020/04/20 Python
基于Python爬取搜狐证券股票过程解析
2020/11/18 Python
运动会入场词50字
2014/02/20 职场文书
内勤岗位职责范本
2015/04/13 职场文书
贫民窟的百万富翁观后感
2015/06/09 职场文书
法制教育讲座心得体会
2016/01/14 职场文书
Python正则表达式中flags参数的实例详解
2022/04/01 Python