版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】ThinkPHP如何实现微信支付
这篇文章给大家分享的是有关ThinkPHP如何实现微信支付的内容。在下觉得挺实用的,因此分享给大家做个参考,一起跟随在下过来看看吧。TP中集成微信支付的流程:1.SDK下载和修改这个就不过多讲了,不知道的可以看看我的上一篇文章:PHP实现微信支付(jsapi支付)流程,里边详细详述了下载下来的文件哪些是需要修改的。2.公众号设置A.还是需要设置网页授权域名,这个没啥特殊的;B.这里要注意一下支付授权目录,使用TP很多人都使用的是重写模式(REWRITE模式)或者在使用REWRITE模式的同时,使用伪静态模式,这时候生成的链接为:http://serverName/Home/Blog/read/id/1;如果使用的是PATHINFO模式的话,生成的链接就是:http://serverName/index.php/Home/Blog/read/id/1,比如在Home模块下的Blog控制器中的某个方法进行支付,我们支付的授权目录应该是http://serverName/Home/Blog/或者http://serverName/index.php/Home/Blog/,这个根据自己的TP的设置的URL模式而定。3.支付流程(1)统一下单下单的支付参数配置,这个跟上一篇讲的基本不变,重点注意的是支付回调验证链接,因为要多次调用,我就直接在Application/Common/Common/function.php中将参数配置封装起来了,我的SDK放在项目根目录下的Api目录下,所以引入SDK的时候不是使用Vendor函数。/**
*
微信支付
*
@param
string
$openId
openid
*
@param
string
$goods
商品名称
*
@param
string
$attach
附加参数,我们可以选择传递一个参数,比如订单ID
*
@param
string
$order_sn
订单号
*
@param
string
$total_fee
金额
*/
function
wxpay($openId,$goods,$order_sn,$total_fee,$attach){
require_once
APP_ROOT."/Api/wxpay/lib/WxPay.Api.php";
require_once
APP_ROOT."/Api/wxpay/payment/WxPay.JsApiPay.php";
require_once
APP_ROOT.'/Api/wxpay/payment/log.php';
//初始化日志
$logHandler=
new
CLogFileHandler(APP_ROOT."/Api/wxpay/logs/".date('Y-m-d').'.log');
$log
=
Log::Init($logHandler,
15);
$tools
=
new
JsApiPay();
if(empty($openId))
$openId
=
$tools->GetOpenid();
$input
=
new
WxPayUnifiedOrder();
$input->SetBody($goods);
//商品名称
$input->SetAttach($attach);
//附加参数,可填可不填,填写的话,里边字符串不能出现空格
$input->SetOut_trade_no($order_sn);
//订单号
$input->SetTotal_fee($total_fee);
//支付金额,单位:分
$input->SetTime_start(date("YmdHis"));
//支付发起时间
$input->SetTime_expire(date("YmdHis",
time()
+
600));//支付超时
$input->SetGoods_tag("test3");
//$input->SetNotify_url("http://".$_SERVER['HTTP_HOST']."/payment.php");
//支付回调验证地址
$input->SetNotify_url("http://".$_SERVER['HTTP_HOST']."/payment.php/WexinApi/WeixinPay/notify");
$input->SetTrade_type("JSAPI");
//支付类型
$input->SetOpenid($openId);
//用户openID
$order
=
WxPayApi::unifiedOrder($input);
//统一下单
$jsApiParameters
=
$tools->GetJsApiParameters($order);
return
$jsApiParameters;
}注意,注意,敲黑板划重点了:支付回调验证链接,必须是没有权限验证的,如果你自己访问那个链接,还需要登录注册验证的,就不要尝试了,必须要可以无障碍访问的链接,而且也不要有一连串的参数传递。最好就是简单粗暴的http://serverName/xxx.php,我在跟目录下,类似于index.php,重新写了一个专门的供支付回调的入口文件payment.php,和它对应的Application/目录下的模块(WexinApi)、控制器(WeixinPay)及方法(notify)://
检测PHP环境
if(version_compare(PHP_VERSION,'5.3.0','<'))
die('require
PHP
>
5.3.0
!');
//
$_GET['m']='Admin';
//
开启调试模式
建议开发阶段开启
部署阶段注释或者设为false
define('APP_DEBUG',True);
//指定模块控制器和方法
$_GET['m']='WexinApi';
$_GET['c']='WeixinPay';
$_GET['a']='notify';
//
定义应用目录
define('APP_PATH','./Application/');
define("APP_ROOT",dirname(__FILE__));
//
引入ThinkPHP入口文件
require
'./ThinkCore/ThinkCore.php';
//
亲^_^
后面不需要任何代码了
就是如此简单现在访问http://serverName/payment.php,就会直接进入到
http://serverName/payment.php/WexinApi/WeixinPay/notify,这样回调验证链接可以写
http://serverName/payment.php,也可以写http://serverName/payment.php/WexinApi/WeixinPay/notify。(2)发起支付照样很简单:/**
*
支付测试
*
微信访问:/payment.php/WexinApi/WeixinPay/pay
*/
public
function
pay(){
$order_sn
=
getrand_num(true);
$openId
=
'';
$jsApiParameters
=
wxpay($openId,'江南极客',$order_sn,1);
$this->assign(array(
'data'
=>
$jsApiParameters
));
$this->display();
}
<html>
<head>
<meta
http-equiv="content-type"
content="text/html;charset=utf-8"/>
<meta
name="viewport"
content="width=device-width,
initial-scale=1"/>
<title>小尤支付测试</title>
<script
type="text/javascript">
//调用微信JS
api
支付
function
jsApiCall()
{
var
data={$data};
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
data,
function(res){
WeixinJSBridge.log(res.err_msg);
//alert('err_code:'+res.err_code+'err_desc:'+res.err_desc+'err_msg:'+res.err_msg);
//alert(res.err_code+res.err_desc+res.err_msg);
//alert(res);
if(res.err_msg
==
"get_brand_wcpay_request:ok"){
alert("支付成功!");
window.location.href="/article/details?id=72765676"
rel="external
nofollow"
;
}else
if(res.err_msg
==
"get_brand_wcpay_request:cancel"){
alert("用户取消支付!");
}else{
alert("支付失败!");
}
}
);
}
function
callpay()
{
if
(typeof
WeixinJSBridge
==
"undefined"){
if(
document.addEventListener
){
document.addEventListener('WeixinJSBridgeReady',
jsApiCall,
false);
}else
if
(document.attachEvent){
document.attachEvent('WeixinJSBridgeReady',
jsApiCall);
document.attachEvent('onWeixinJSBridgeReady',
jsApiCall);
}
}else{
jsApiCall();
}
}
</script>
</head>
<body>
<br/>
<font
color="#9ACD32"><b>该笔订单支付金额为<span
style="color:#f00;font-size:50px">1分</span>钱</b></font><br/><br/>
<font
color="#9ACD32"><b><span
style="color:#f00;font-size:50px;margin-left:40%;">1分</span>钱也是爱</b></font><br/><br/>
<p
align="center">
<button
style="width:210px;
height:50px;
border-radius:
15px;background-color:#FE6714;
border:0px
#FE6714
solid;
cursor:
pointer;
color:white;
font-size:16px;"
type="button"
onclick="callpay()"
>果断买买买^_^</button>
</p>
</body>
</html>不过支付页面的URL要注意了,因为支付页面的URL肯定带有不少参数,刚才说了TP中使用的REWRITE模式,你的链接为类似[
http://serverName/Home/Blog/read/id/1]这样的,可能带有更多参数,这时候微信支付会认为你的支付授权目录是[
http://serverName/Home/Blog/read/id/],但是你真实的授权目录是[
http://serverName/Home/Blog/],所以就会报错。处理方法就是,在进入支付页面的时候,重构URL,写成普通模式,即为[
http://serverName/Home/Blog/read?id=1],这样就可以了。(3)支持成功回调现在支付完成,就会进入到之前写好的链接对应的方法,即[
http://serverName/payment.php/WexinApi/WeixinPay/notify]://微信支付回调验证
public
function
notify(){
$xml
=
$GLOBALS['HTTP_RAW_POST_DATA'];
//
这句file_put_contents是用来查看服务器返回的XML数据
测试完可以删除了
file_put_contents('./Api/wxpay/logs/log.txt',$xml,FILE_APPEND);
//将服务器返回的XML数据转化为数组
//$data
=
json_decode(json_encode(simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA)),true);
$data
=
xmlToArray($xml);
//
保存微信服务器返回的签名sign
$data_sign
=
$data['sign'];
//
sign不参与签名算法
unset($data['sign']);
$sign
=
$this->makeSign($data);
//
判断签名是否正确
判断支付状态
if
(
($sign===$data_sign)
&&
($data['return_code']=='SUCCESS')
&&
($data['result_code']=='SUCCESS')
)
{
$result
=
$data;
//
这句file_put_contents是用来查看服务器返回的XML数据
测试完可以删除了
file_put_contents('./Api/wxpay/logs/log1.txt',$xml,FILE_APPEND);
//获取服务器返回的数据
$order_sn
=
$data['out_trade_no'];
//订单单号
$order_id
=
$data['attach'];
//附加参数,选择传递订单ID
$openid
=
$data['openid'];
//付款人openID
$total_fee
=
$data['total_fee'];
//付款金额
//更新数据库
$this->updateDB($order_id,$order_sn,$openid,$total_fee);
}else{
$result
=
false;
}
//
返回状态给微信服务器
if
($result)
{
$str='<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
}else{
$str='<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败]]></return_msg></xml>';
}
echo
$str;
r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 心血管疾病的MR工具变量筛选策略
- 心脑血管疾病社区预防的健康传播路径
- 心脏移植供体分配的罕见血型匹配策略
- 心脏微血管功能障碍的血管新生促进策略
- 心脏再生AI监管技术支撑
- 心梗后心脏康复中的神经内分泌调节策略
- 微创技术推广中的公众科普与人文素养提升
- 微创器械使用与DVP发生的关联分析
- 循证医学GRADE证据可视化传播策略
- 影像与手术技术传承与创新
- 投标标书制作培训
- 陌陌聊天话术技巧
- 医疗器械质量文件审核批准管理制度
- 改造房产工厂合同范本
- 2025-2026学年泰山版四年级信息技术上册(全册)教学设计(附目录)
- 江苏省农业农村厅直属事业单位招聘考试真题2025
- DB43-T 612-2021 医疗机构能耗定额
- 2025年四川省法院书记员招聘考试笔试试题含答案
- 大一期末c语言考试真题及答案
- 生物安全培训课件模板
- 筑梦青春强国有我+课件-2025-2026学年高二上学期国庆节主题班会
评论
0/150
提交评论