php php微信支付接口开发几种方式

阅读 12704
【】本篇文章內容沒有在維護了,一年前寫下來的不知道微信的接口有沒有改變,想要實際應用的可以看下&朋友的開源項目:http://git.oschina.net/shuaibai123/thinkphp-bjyadmin &本人暫時沒有使用過,不過看起來不錯~
=====================================================================
业务场景:
用户在网页上选定商品,然后生成QRcode,用户扫后付款返回信息给server。
用到的支付模式:
NATIVE模式二
服务端信息:
PHP,Thinkphp3.2框架
1.文件整合
首先把官方提供的demo下下来:
下下来以后 把demo里面的WxPayPubHelper整个文件夹放到Thinkphp项目里面Vendor文件夹中,放置之后项目就可以通过Vendor("WxPayPubHelper.文件名")来调用里面的php文件(.php不需要加)
2.代码整合
&&&&&&&&&模式二主要用到的是wxpay文件夹里面的native_dynamic_qrcode.php,notify_url.php和qrcode.js三个。
& & & & 在配置文件中配置要用到的信息,包括微信号ID、微信号SECRET、商户ID、商户支付秘钥、证书的url路径、异步通知的URL
& & 要注意的是:异步URL地址必须是PATHINFO模式,如果是参数模式的话会调用不了。同时还要在微信号上微信支付-&开发配置-&支付配置中填好相同的NOTIFY_URL
& & & &然后可以开始写自己的代码了
& & & & &建一个新的controller(或者整合到你自己的controller里面,在这里我建立一个新的Pay模块里面用IndexController)
public&function&index(){
Vendor("WxPayPubHelper.WxPayPubHelper");
//使用统一支付接口
$unifiedOrder&=&new&\UnifiedOrder_pub();
//设置统一支付接口参数
//设置必填参数
//appid已填,商户无需重复填写
//mch_id已填,商户无需重复填写
//noncestr已填,商户无需重复填写
//spbill_create_ip已填,商户无需重复填写
//sign已填,商户无需重复填写
$unifiedOrder-&setParameter("body","贡献一分钱");//商品描述
//自定义订单号,此处仅作举例
$timeStamp&=&time();
$out_trade_no&=&C('wxappid')."$timeStamp";
$unifiedOrder-&setParameter("out_trade_no","$out_trade_no");//商户订单号&
$unifiedOrder-&setParameter("total_fee","1");//总金额
$unifiedOrder-&setParameter("notify_url",C('NOTIFY_URL'));//通知地址&
//var_dump(urlencode(C('NOTIFY_URL')));
$unifiedOrder-&setParameter("trade_type","NATIVE");//交易类型
//非必填参数,商户可根据实际情况选填
//$unifiedOrder-&setParameter("sub_mch_id","XXXX");//子商户号&&
//$unifiedOrder-&setParameter("device_info","XXXX");//设备号&
//$unifiedOrder-&setParameter("attach","XXXX");//附加数据&
//$unifiedOrder-&setParameter("time_start","XXXX");//交易起始时间
//$unifiedOrder-&setParameter("time_expire","XXXX");//交易结束时间&
//$unifiedOrder-&setParameter("goods_tag","XXXX");//商品标记&
//$unifiedOrder-&setParameter("openid","XXXX");//用户标识
$unifiedOrder-&setParameter("product_id","1101");//商品ID
//获取统一支付接口结果
$unifiedOrderResult&=&$unifiedOrder-&getResult();
var_dump($unifiedOrderResult);
//商户根据实际情况设置相应的处理流程
if&($unifiedOrderResult["return_code"]&==&"FAIL")&
//商户自行增加处理流程
echo&"通信出错:".$unifiedOrderResult['return_msg']."&br&";
elseif($unifiedOrderResult["result_code"]&==&"FAIL")
//商户自行增加处理流程
echo&"错误代码:".$unifiedOrderResult['err_code']."&br&";
echo&"错误代码描述:".$unifiedOrderResult['err_code_des']."&br&";
elseif($unifiedOrderResult["code_url"]&!=&NULL)
//从统一支付接口获取到code_url
$code_url&=&$unifiedOrderResult["code_url"];
//商户自行增加处理流程
$this-&assign('code_url',$code_url);
$this-&assign("unifiedOrderResult",$unifiedOrderResult);
$this-&theme('default')-&display('Pay/index');
& & 然后加上以上的代码,代码直接从demo里面抽出来的,主要就是通过Vender读到helper, 然后是前端部分:
&!DOCTYPE&HTML&
&meta&charset="UTF-8"&
&title&微信安全支付&/title&
&div&align="center"&id="qrcode"&
&div&align="center"&
&p&订单号:&?php&echo&$out_trade_&?&&/p&
&div&align="center"&
&form&&action="./order_query.php"&method="post"&
&input&name="out_trade_no"&type='hidden'&value="&?php&echo&$out_trade_&?&"&
&&&&&button&type="submit"&&查询订单状态&/button&
&div&align="center"&
&form&&action="./refund.php"&method="post"&
&input&name="out_trade_no"&type='hidden'&value="&?php&echo&$out_trade_&?&"&
&input&name="refund_fee"&type='hidden'&value="1"&
&&&&&button&type="submit"&&申请退款&/button&
&div&align="center"&
&a&href="../index.php"&返回首页&/a&
&script&src="&?php&echo&theme_url();&?&/js/qrcode.js"&&/script&
if(&?php&echo&$unifiedOrderResult["code_url"]&!=&NULL;&?&)
var&url&=&"&?php&echo&$code_?&";
//参数1表示图像大小,取值范围1-10;参数2表示质量,取值范围'L','M','Q','H'
var&qr&=&qrcode(10,&'M');
qr.addData(url);
qr.make();
var&wording=document.createElement('p');
wording.innerHTML&=&"扫我,扫我";
var&code=document.createElement('DIV');
code.innerHTML&=&qr.createImgTag();
var&element=document.getElementById("qrcode");
element.appendChild(wording);
element.appendChild(code);
& &JS生成QR部分也是用demo的代码,主要就是督导qrcode.js然后接受到服务端返回的信息把QRcode生成出来,其他查询订单和退款功能这里不做演示了。
& 到这里就可以用http//你的网址/index.php/pay/index/index 访问看到你的支付QRcode了
& 当然还没结束,用户支付成功后要获取到微信服务端的异步通知信息,在IndexController中加入一个notify方法:
public&function&notify(){
//include_once("./log_.php");
//echo&'access';
Vendor("WxPayPubHelper.WxPayPubHelper");
&&&&//使用通用通知接口
$notify&=&new&\Notify_pub();
//存储微信的回调
$xml&=&$GLOBALS['HTTP_RAW_POST_DATA'];
$notify-&saveData($xml);
//验证签名,并回应微信。
//对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,
//微信会通过一定的策略(如30分钟共8次)定期重新发起通知,
//尽可能提高通知的成功率,但微信不保证通知最终能成功。
//&$this-&log_result("【checkSign】:\n".$notify-&checkSign()."\n");
if($notify-&checkSign()&==&FALSE){
$notify-&setReturnParameter("return_code","FAIL");//返回状态码
$notify-&setReturnParameter("return_msg","签名失败");//返回信息
$notify-&setReturnParameter("return_code","SUCCESS");//设置返回码
$returnXml&=&$notify-&returnXml();
echo&$returnX
//&$this-&log_result("【返回回调信息】:\n".$returnXml."\n");
//==商户根据实际情况设置相应的处理流程,此处仅作举例=======
//以log文件形式记录回调信息
$this-&log_result("【接收到的notify通知】:\n".$xml."\n");
if($notify-&checkSign()&==&TRUE)
if&($notify-&data["return_code"]&==&"FAIL")&{
//此处应该更新一下订单状态,商户自行增删操作
$this-&log_result("【通信出错】:\n".$xml."\n");
elseif($notify-&data["result_code"]&==&"FAIL"){
//此处应该更新一下订单状态,商户自行增删操作
$this-&log_result("【业务出错】:\n".$xml."\n");
//此处应该更新一下订单状态,商户自行增删操作
$this-&log_result("【支付成功】:\n".$xml."\n");
//商户自行增加处理流程,
//例如:更新订单状态
//例如:数据库操作
//例如:推送支付完成信息
& 确认 &可以访问到,这个地址就是前面提及到的NOTIFY_URL了,要跟微信支付配置保持一致。然后到这里为止就成功了,访问index出现QRcode然后用户扫描支付成功 微信服务端调用notify,还有一点要注意的是微信服务端异步调用notify在没接受到SUCCESS返回前都是继续发(目前设定是半小时8次),所以记得要返回SUCCESS哟(给出的代码已经返回了),然后最好就做好重复notify的冲突处理,例如判断订单是否被处理过了,避免订单被重复刷新。
虽然是挺简单的东西,不过可能当中也会有些坑,为了帮助大家所以写下这篇小东西,谢谢哈~
& 著作权归作者所有
人打赏支持
“”在线下联结了各位 OSCer,推广开源项目和理念,很荣幸有你的参与~
领取条件:参与过开源中国“源创会”的 OSCer 可以领取
码字总数 32191
高级程序员
引用来自“白俊遥”的评论挺详细的了;分享个针对thinkphp深度整合的微信支付demo:http://baijunyao.com/article/78不錯不錯~
挺详细的了;分享个针对thinkphp深度整合的微信支付demo:http://baijunyao.com/article/78
评论删除后,数据将无法恢复
springMvc-dubbo-pay 此版本为springMvc整合版,boot版本见spring-boot-pay 有时候开发者想要的不一定是一个大而全的项目,而是可以集成到适合我们项目中的Demo。 以下所有支付Demo,绝非唬人...
小柒2012 ?
#pay-java-parent ##整合支付模块(微信支付,支付宝) 声明: 本项目最初想法自 https://github.com/chanjarster/weixin-java-tools, 15年1月左右关注chanjarster/weixin-java-tools,并将其...
spring-boot-pay 支付服务:支付宝,微信,银联详细 代码案例 (除银联支付可以测试以外,支付宝和微信支付测试均需要企业认证,个人无法完成测试),项目启动前请仔细阅读 注意事项 。 API接口...
小柒2012 ?
ThinkPHP3.2中集成财付通支付 在项目过程中用到了支付宝和财付通的支付接口问题,发现在TP还未有人写财付通的实例,我仿照前辈们写的一个案例http://www.thinkphp.cn/code/240.html写了一个 ...
mickelfeng ?
简介 使用 thinkphp 开发项目的过程中把一些常用的功能或者第三方 sdk 整合好;开源供亲们参考; 这些都是经过线上运营考验的;无毒害可以免费放心折腾使用;只要不会某一天找到我说因为借鉴了...
创建 QQ 群及捐赠渠道 链接 博客:http://baijunyao.com github:https://github.com/baijunyao/thinkphp-bjyadmin oschina:http://git.oschina.net/shuaibai123/thinkphp-bjyadmin 简介 使......
轻量级支付模块集成(微信支付,友店扫码,支付宝,富友,银联, payoneer皮卡 )支付整合,app,扫码,即时到帐刷卡付条码付、支持多种支付类型多支付账户,支付与业务完全剥离,简单几行代码即可实...
摘要 为了便于微信开发,此处在ThinkPHP5.0 框架下整合了微信扫码支付的功能,测试需要外网项目部署. 对于TP3的集成,可参考之前写的文章 ThinkPHP 框架下微信支付 功能开发 微信支付SDK整理...
DBShop 电子商务网店系统,采用业界知名框架 ZendFramework 2 开发而成。 下面为功能简介 1、在线更新:在线系统更新和在线模板安装与更新,简单、方便、快捷,省却了手动更新的繁琐步骤。同...
静静的风 ?
优雅的轻量级支付模块集成支付对接支付整合(微信支付,支付宝,银联,友店,富友,payoneer皮卡,paypal贝宝)app,扫码,即时到帐刷卡付条码付、支持多种支付类型多支付账户,支付与业务完全剥离,...
egzosn ? 05/07 ?
没有更多内容
加载失败,请刷新页面
JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...
JandenMa ? 今天 ?
转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......
狐狸老侠 ? 今天 ?
我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...
p柯西 ? 今天 ?
前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......
晨猫 ? 今天 ?
crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...
Linux学习笔记 ? 今天 ?
5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...
江左煤郎 ? 今天 ?
面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。
秋日芒草 ? 今天 ?
1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{
HelloWorld helloW
public void setHelloWorld...
霍淇滨 ? 昨天 ?
马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...
漫步当下 ? 昨天 ?
序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......
go4it ? 昨天 ?
没有更多内容
加载失败,请刷新页面
文章删除后无法恢复,确定取消删除此文章吗?
亲,自荐的博客将通过私信方式通知管理员,优秀的博客文章审核通过后将在博客推荐列表中显示
确定推荐此文章吗?
确定推荐此博主吗?
聚合全网技术文章,根据你的阅读喜欢进行个性推荐
指定官方社区
深圳市奥思网络科技有限公司版权所有php微信支付之APP支付方法_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
php微信支付之APP支付方法
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩9页未读,
定制HR最喜欢的简历
你可能喜欢利不可独而可享,谋不可众而可寡!
PHP实现微信支付(jsapi支付)流程
最近接触到一个项目,涉及到微信支付,搞微信开发这么久以来,还没搞过支付,之前也就搞过公众号发红包,感谢前辈们的探索,我看了他们的博文,让我少走了很多弯路。
前期准备:
1.微信认证服务号,并且开通了微信支付
2.微信支付SDK,下载地址:
3.登录微信支付平台下载支付证书
方法步骤:
1.demo文件处理
(1)将官方的demo下载下来,文件名为WxpayAPI_php_v3,把这文件重命名为wxpay,为了后边书写目录方便;(2)打开lib文件夹下的WxPay.Api.php文件,在537行有一段curl网络请求配置代码:
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验为了禁止 cURL 验证对等证书(peer's certificate)。
(3)打开lib文件夹下的WxPay.Config.php文件,第25行开始,根据自己的账号完成基本信息设置;
const APPID = '公众账号APPID';
const MCHID = '商户号';
const KEY = '商户支付密钥';
const APPSECRET = '公众帐号secert';(4)打开lib文件夹下的WxPay.Notify.php文件,第79行的代码:if($needSign == true &&
$this-&GetReturn_code($return_code) == "SUCCESS")
$this-&SetSign();
if($needSign == true &&
$this-&GetReturn_code() == "SUCCESS")
$this-&SetSign();
}(5)打开cert证书目录,将里边的两个证书换成自己的支付证书。
2.公众号后台设置(1)配置网页授权域名,我的域名是(xy.chuyin.ren);
(1)配置支付授权目录,域名是(xy.chuyin.ren),我将demo放到此域名指向的目录的weixinopen/文件夹下,demo中jsapi.php文件位于example/目录下,所以支付授权目录为:xy.chuyin.ren/weixinopen/wxpay/example/
3.支付流程
打开example目录下的jsapi.php文件,支付发起和处理,都是在这里完成。
(1)获取用户openid之前配置好了自己的APPID和APPSecert,所以这里不用处理。
//①、获取用户openid
$tools = new JsApiPay();
$openId = $tools-&GetOpenid();这里首先初始化的一个JsApiPay()类得到一个对象,文件对应example/目录下的WxPay.JsApiPay.php,调用GetOpenid()方法,会自动获取自己的openID。
(2)统一下单
//②、统一下单
$input = new WxPayUnifiedOrder();
$input-&SetBody("test");
$input-&SetAttach("test");
$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("test");
$input-&SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");
$input-&SetTrade_type("JSAPI");
$input-&SetOpenid($openId);
$order = WxPayApi::unifiedOrder($input);
echo '&font color="#f00"&&b&统一下单支付单信息&/b&&/font&&br/&';
printf_info($order);
$jsApiParameters = $tools-&GetJsApiParameters($order);对应WxPay.Api.php的第24行的unifiedOrder()方法,配置订单信息和支付回调函数,这里需要修改几个参数:
A. 商品名称:$input-&SetBody("test");
$input-&SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));
C. 支付金额
$input-&SetTotal_fee("1");
D. 支付验证链接
设置为你的notify.php文件所在的位置,所以我这里设置为:http://xy.chuyin.ren/weixinopen/wxpay/example/notify.php
也可以写其他地址,当然要在支付授权域名之下,支付成功之后就会自动回调到该链接指定的方法里边,可以在里边进行判断和数据库操作.
$input-&SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");
E. 附加参数
$input-&SetAttach("test");
附加参数,可填可不填,填写的话,里边字符串最好不要出现空格。
这时候,点击支付应该就可以成功支付了。(3)发起支付
&script type="text/javascript"&
//调用微信JS api 支付
function jsApiCall()
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
&?php echo $jsApiP ?&,
function(res){
WeixinJSBridge.log(res.err_msg);
alert(res.err_code+res.err_desc+res.err_msg);
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);
jsApiCall();
点击立即支付按钮调用的就是 callpay() 函数,他有会调用jsApiCall() 函数打开支付程序。
jsApiCall() 函数会监听每一步动作:
res.err_msg 为get_brand_wcpay_request:cancel 表明前端判断的取消支付,es.err_msg 为get_brand_wcpay_request:ok 表明前端判断的支付成功,我们可以根据这个将支付跳转到成功页面。
(4)支持成功回调通过前端jsApiCall()函数可以监听支付结果,但是这个并不可信。确认是否支付成功还是应当通过notify.php 处理业务逻辑。前边配置好了支付验证链接SetNotify_url(),支付完成后,微信服务器会根据链接自动请求你的notify.php文件,打开这个文件,其实这个文件最主要的代码就两行:
$notify = new PayNotifyCallBack();
$notify-&Handle(false);
由此跟踪到WxPay.Notify.php类文件的Handle()函数:/**
* 回调入口
* @param bool $needSign
是否需要签名输出
final public function Handle($needSign = true)
$msg = "OK";
//当返回false的时候,表示notify中调用NotifyCallBack回调失败获取签名校验失败,此时直接回复失败
$result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg);
if($result == false){
$this-&SetReturn_code("FAIL");
$this-&SetReturn_msg($msg);
$this-&ReplyNotify(false);
//该分支在成功回调到NotifyCallBack方法,处理完成之后流程
$this-&SetReturn_code("SUCCESS");
$this-&SetReturn_msg("OK");
$this-&ReplyNotify($needSign);
主要代码:$result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg);然后来到WxPay.Api.php文件的第411行,notify()函数:/**
* 支付结果通用通知
* @param function $callback
* 直接回调函数使用方法: notify(you_function);
* 回调类成员函数方法:notify(array($this, you_function));
* $callback
原型为:function function_name($data){}
public static function notify($callback, &$msg)
//获取通知的数据
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
//file_put_contents('log.txt',$xml,FILE_APPEND);
//如果返回成功则验证签名
$result = WxPayResults::Init($xml);
} catch (WxPayException $e){
$msg = $e-&errorMessage();
return call_user_func($callback, $result);
这里面的$xml=$GLOBALS['HTTP_RAW_POST_DATA'],就是支付成功后用户返回给你的一个结果,他是一个xml格式的字符串。
我们可以将这里返回的xml数据记录下来,然后打开看看$out_trade_no就是在支付之前我自己设置的订单号码,$attach就是设置的附加参数。
得到了这个订单号,然后我就直接在下面写支付成功后的逻辑了,比如改变数据库中的数据等等。
这样 微信支付的 JsApi支付就大致分析完成了。
这是集成了官方的SDK实现的,如果不使用SDK,可以使用更简单的方法,见:
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!本文参与,欢迎正在阅读的你也加入,一起分享。|151 篇文章44 人订阅一个PHPer的成长之路,关注PHP等开发技术相关文章来自专栏193来自专栏128来自专栏170来自专栏105来自专栏117来自专栏108ThinkPHP整合微信支付之JSAPI模式 - ThinkPHP框架
目前微信是很火的,微信支付目前很少在网上能看到一系列详细的demo,因此,花一点时间来做一下关于微信支付系列教程,本次教程是JSAPI模式支付,其他的还会继续写下去首先,下载微信支付的demo,我们根据微信上的demo来整合到TP中。
介绍下我们这里需要用到的几个文件:
在demo文件夹中:
js_api_call.php:提供了微信jsapi的主要功能
log_.php:提供打印日志功能
notify_url.php:异步通知功能
notify_url.log:异步通知日志
qrcode.js:生成二维码js插件
接下来介绍下WxPayPubHelper文件夹下的文件:
cacert 文件夹是存放微信证书的(PS:具体我还没怎么用证书,虽然下载下来了,证书请在微信商户平台上下载)
SDKRuntimeException.php:这个就是处理异常的、
WxPay.pub.config.php:这个是做一些配置的,稍后会详细讲解
WxPayPubHelper.php:这个其实就是微信支付的工具类,对于初学者只要知道怎么用他里面的方法就够了
OK,了解了微信官方提供的文件,我们就可以开始整合到TP中了,废话不多说,这就开始!
step1:将demo中的WxPayPubHelper整个文件夹都复制到TP的Vendor目录下,像我这样:
step2:配置WxPay.pub.config.php文件:
这里的配置都有注释,如果还有不懂或者配置出现问题可以留言提问
同时我把微信的这个配置放到了TP的config中,这一步大家可以随意&?php
return&array(
&&&&//'配置项'=&'配置值'
&&&&define('WEB_HOST',&'这是您的网站域名地址'),
&&&&/*微信支付配置*/
&&&&'WxPayConf_pub'=&array(
&&&&&&&&'APPID'&=&&'您的APPID',
&&&&&&&&'MCHID'&=&&'您的商户ID',
&&&&&&&&'KEY'&=&&'商户秘钥',
&&&&&&&&'APPSECRET'&=&&'您的APPSECRET',
&&&&&&&&'JS_API_CALL_URL'&=&&WEB_HOST.'/index.php/Home/WxJsAPI/jsApiCall',
&&&&&&&&'SSLCERT_PATH'&=&&WEB_HOST.'/ThinkPHP/Library/Vendor/WxPayPubHelper/cacert/apiclient_cert.pem',
&&&&&&&&'SSLKEY_PATH'&=&&WEB_HOST.'/ThinkPHP/Library/Vendor/WxPayPubHelper/cacert/apiclient_key.pem',
&&&&&&&&'NOTIFY_URL'&=&&&WEB_HOST.'/index.php/Home/WxJsAPI/notify',
&&&&&&&&'CURL_TIMEOUT'&=&&30
);step3:将生成二维码的js放在Public目录下(这里目前用不到,在用扫码支付的情况才用到这个js),将日志文件放在Public目录下:像我这样:
step4:创建控制器:这里创建了一个WxJsAPIController的控制器,这里大家随便起名字,只要这个跟你们在公众平台上的设置相对应就可以(公众平台设置稍后介绍)
下面是控制器的代码部分了,首先初始化控制器,将WxPayPubHelper导入/**
&&&&&*&初始化
&&&&public&function&_initialize()
&&&&&&&&//引入WxPayPubHelper
&&&&&&&&vendor('WxPayPubHelper.WxPayPubHelper');
&&&&}接下来是使用统一支付接口,获取prepay_id的方法:&public&function&jsApiCall()
&&&&&&&&//使用jsapi接口
&&&&&&&&$jsApi&=&new&\JsApi_pub();
&&&&&&&&//=========步骤1:网页授权获取用户openid============
&&&&&&&&//通过code获得openid
&&&&&&&&if&(!isset($_GET['code']))
&&&&&&&&&&&&//触发微信返回code码
&&&&&&&&&&&&$url&=&$jsApi-&createOauthUrlForCode(C('WxPayConf_pub.JS_API_CALL_URL'));
&&&&&&&&&&&&Header(&Location:&$url&);
&&&&&&&&}else
&&&&&&&&&&&&//获取code码,以获取openid
&&&&&&&&&&&&$code&=&$_GET['code'];
&&&&&&&&&&&&$jsApi-&setCode($code);
&&&&&&&&&&&&$openid&=&$jsApi-&getOpenId();
&&&&&&&&//=========步骤2:使用统一支付接口,获取prepay_id============
&&&&&&&&//使用统一支付接口
&&&&&&&&$unifiedOrder&=&new&\UnifiedOrder_pub();
&&&&&&&&//设置统一支付接口参数
&&&&&&&&//设置必填参数
&&&&&&&&//appid已填,商户无需重复填写
&&&&&&&&//mch_id已填,商户无需重复填写
&&&&&&&&//noncestr已填,商户无需重复填写
&&&&&&&&//spbill_create_ip已填,商户无需重复填写
&&&&&&&&//sign已填,商户无需重复填写
&&&&&&&&$unifiedOrder-&setParameter(&openid&,$openid);//商品描述
&&&&&&&&$unifiedOrder-&setParameter(&body&,&贡献一分钱&);//商品描述
&&&&&&&&//自定义订单号,此处仅作举例
&&&&&&&&$timeStamp&=&time();
&&&&&&&&$out_trade_no&=&C('WxPayConf_pub.APPID').$timeS
&&&&&&&&$unifiedOrder-&setParameter(&out_trade_no&,$out_trade_no);//商户订单号
&&&&&&&&$unifiedOrder-&setParameter(&total_fee&,&1&);//总金额
&&&&&&&&$unifiedOrder-&setParameter(&notify_url&,C('WxPayConf_pub.NOTIFY_URL'));//通知地址
&&&&&&&&$unifiedOrder-&setParameter(&trade_type&,&JSAPI&);//交易类型
&&&&&&&&//非必填参数,商户可根据实际情况选填
&&&&&&&&//$unifiedOrder-&setParameter(&sub_mch_id&,&XXXX&);//子商户号
&&&&&&&&//$unifiedOrder-&setParameter(&device_info&,&XXXX&);//设备号
&&&&&&&&//$unifiedOrder-&setParameter(&attach&,&XXXX&);//附加数据
&&&&&&&&//$unifiedOrder-&setParameter(&time_start&,&XXXX&);//交易起始时间
&&&&&&&&//$unifiedOrder-&setParameter(&time_expire&,&XXXX&);//交易结束时间
&&&&&&&&//$unifiedOrder-&setParameter(&goods_tag&,&XXXX&);//商品标记
&&&&&&&&//$unifiedOrder-&setParameter(&openid&,&XXXX&);//用户标识
&&&&&&&&//$unifiedOrder-&setParameter(&product_id&,&XXXX&);//商品ID
&&&&&&&&$prepay_id&=&$unifiedOrder-&getPrepayId();
&&&&&&&&//=========步骤3:使用jsapi调起支付============
&&&&&&&&$jsApi-&setPrepayId($prepay_id);
&&&&&&&&$jsApiParameters&=&$jsApi-&getParameters();
&&&&&&&&$this-&assign('jsApiParameters',$jsApiParameters);
&&&&&&&&$this-&display('pay');
&&&&&&&&//echo&$jsApiP
&&&&}这里都是复制微信demo的,改改名字罢了,没什么其他的
接下来是异步通知方法,也是复制的微信demo上的&public&function&notify()
&&&&&&&&//使用通用通知接口
&&&&&&&&$notify&=&new&\Notify_pub();
&&&&&&&&//存储微信的回调
&&&&&&&&$xml&=&$GLOBALS['HTTP_RAW_POST_DATA'];
&&&&&&&&$notify-&saveData($xml);
&&&&&&&&//验证签名,并回应微信。
&&&&&&&&//对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,
&&&&&&&&//微信会通过一定的策略(如30分钟共8次)定期重新发起通知,
&&&&&&&&//尽可能提高通知的成功率,但微信不保证通知最终能成功。
&&&&&&&&if($notify-&checkSign()&==&FALSE){
&&&&&&&&&&&&$notify-&setReturnParameter(&return_code&,&FAIL&);//返回状态码
&&&&&&&&&&&&$notify-&setReturnParameter(&return_msg&,&签名失败&);//返回信息
&&&&&&&&}else{
&&&&&&&&&&&&$notify-&setReturnParameter(&return_code&,&SUCCESS&);//设置返回码
&&&&&&&&$returnXml&=&$notify-&returnXml();
&&&&&&&&echo&$returnX
&&&&&&&&//==商户根据实际情况设置相应的处理流程,此处仅作举例=======
&&&&&&&&//以log文件形式记录回调信息
//&&&&&&&&&$log_&=&new&Log_();
&&&&&&&&$log_name=&__ROOT__.&/Public/notify_url.log&;//log文件路径
&&&&&&&&log_result($log_name,&【接收到的notify通知】:\n&.$xml.&\n&);
&&&&&&&&if($notify-&checkSign()&==&TRUE)
&&&&&&&&&&&&if&($notify-&data[&return_code&]&==&&FAIL&)&{
&&&&&&&&&&&&&&&&//此处应该更新一下订单状态,商户自行增删操作
&&&&&&&&&&&&&&&&log_result($log_name,&【通信出错】:\n&.$xml.&\n&);
&&&&&&&&&&&&}
&&&&&&&&&&&&elseif($notify-&data[&result_code&]&==&&FAIL&){
&&&&&&&&&&&&&&&&//此处应该更新一下订单状态,商户自行增删操作
&&&&&&&&&&&&&&&&log_result($log_name,&【业务出错】:\n&.$xml.&\n&);
&&&&&&&&&&&&}
&&&&&&&&&&&&else{
&&&&&&&&&&&&&&&&//此处应该更新一下订单状态,商户自行增删操作
&&&&&&&&&&&&&&&&log_result($log_name,&【支付成功】:\n&.$xml.&\n&);
&&&&&&&&&&&&}
&&&&&&&&&&&&//商户自行增加处理流程,
&&&&&&&&&&&&//例如:更新订单状态
&&&&&&&&&&&&//例如:数据库操作
&&&&&&&&&&&&//例如:推送支付完成信息
&&&&}这里我把记录日志的类写到了function.php中:function&&log_result($file,$word)
&&&&$fp&=&fopen($file,&a&);
&&&&flock($fp,&LOCK_EX)&;
&&&&fwrite($fp,&执行日期:&.strftime(&%Y-%m-%d-%H:%M:%S&,time()).&\n&.$word.&\n\n&);
&&&&flock($fp,&LOCK_UN);
&&&&fclose($fp);
}好了 其实控制器的方法就这么多,没什么其他的了,下面看一下页面,直接上代码吧:&!DOCTYPE&html&
&&&&&meta&http-equiv=&content-type&&content=&text/charset=utf-8&/&
&&&&&title&微信安全支付&/title&
&&&&&script&type=&text/javascript&&
&&&&&&&&//调用微信JS&api&支付
&&&&&&&&function&jsApiCall()
&&&&&&&&&&&&WeixinJSBridge.invoke(
&&&&&&&&&&&&&&&&'getBrandWCPayRequest',
&&&&&&&&&&&&&&&&&?php&echo&$jsApiP&?&,
&&&&&&&&&&&&&&&&function(res){
&&&&&&&&&&&&&&&&&&&&WeixinJSBridge.log(res.err_msg);
&&&&&&&&&&&&&&&&&&&&alert(res.err_code+res.err_desc+res.err_msg);
&&&&&&&&&&&&&&&&&&&&//alert(&{$jsApiParameters}&);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&);
&&&&&&&&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&
&&&&&/br&&/br&&/br&&/br&
&&&&&div&align=&center&&
&&&&&&&&&button&style=&width:210&height:30&background-color:#FE6714;&border:0px&#FE6714&&cursor:&&&color:&&font-size:16&&type=&button&&onclick=&callpay()&&&贡献一下&/button&
&&&&&/div&
&/html&无须改动什么,直接复制就好
接下来是微信公众平台上的配置了,这里我遇到过问题,如果有在这里遇到问题的同学请留言,比如出现了access_deined或者access_notallowed等问题,这都可能是因为这里配置不对。
请看配置过程截图:
点击修改进入配置:
好了,可以测试了:下面是我的测试截图:
用微信扫描二维码
微信上点击贡献一下出现支付页面:
到此为止,微信JSAPI支付功能就全部做好了
当然,如果你是第一次做,肯定会遇到各种问题,
如果你是新手,遇到的问题都不知道为什么,
及时你做过了再做我相信还是可能由于细节上的疏忽会出现问题
不过不要烦躁,耐心的去发现问题
有问题请留言,下面还会介绍微信扫码支付模式一,模式二的详细教程
微信支付教程扫码模式一:
微信支付教程扫码模式二:
微信支付教程刷卡支付:
欢迎大家吐槽,转载请说明出处,请支持原创,谢谢!
我们的微信开发群:一群:
代码已放在群文件中
欢迎大家加入讨论问题
积分:1753
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。

我要回帖

更多关于 php微信支付接口开发 的文章

 

随机推荐