与微信支付的框架集成模型详细图文讲解
更新时间:2019年4月9日11:39:24 作者:
本文主要介绍微信支付的框架集成模型,并以图文形式详细分析框架集成模型支付操作的具体流程、步骤以及相关操作注意事项。有需要的朋友可以参考以下
本文的例子描述了该框架对微信支付模型的集成。分享给大家,供大家参考,具体如下:
微信现在非常流行,网上很少能看到微信支付的一系列详细演示。因此,花点时间做一下关于微信支付的系列教程。
本教程是关于模式支付的,其他的会继续写。
首先,下载微信支付的demo。我们根据微信上的demo将其集成到TP中。
这里介绍一下我们需要用到的几个文件:
在演示文件夹中:
.php:提供微信的主要功能
log_.php:提供打印日志功能
.php:异步通知函数
.log:异步通知日志
.js:生成二维码js插件
接下来我们介绍一下文件夹中的文件:
该文件夹存放的是微信证书(PS:虽然我已经下载了,但是我还没有具体使用过证书,证书请到微信商户平台下载)
.php:这是用于处理异常的,
.pub..php:这是一些配置,稍后会详细解释。
.php:这其实是一个微信支付的工具类。对于初学者来说,知道如何使用它的方法就足够了。
OK,了解了微信提供的官方文档后,我们就可以开始集成到TP了。话不多说,让我们开始吧!
:将demo中的整个文件夹复制到TP目录下,像这样:
:.pub..php 文件:
这里的配置都注释掉了。如果还是不明白或者配置有问题,可以留言提问。
同时我把微信配置放入TP中。在这一步你可以做任何你想做的事。
'配置值' 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 ) );
:将生成二维码的js放到该目录下(这里暂时不用,只是扫码支付时使用),将日志文件放到该目录下:像我一样:
:创建控制器:这里创建一个控制器。你可以随意命名,只要与你在公众平台上的设置相对应即可(公众平台设置稍后会介绍)
以下是控制器的代码部分。首先初始化控制器并导入
/** * 初始化 */ public function _initialize() { //引入WxPayPubHelper vendor('WxPayPubHelper.WxPayPubHelper'); }
下一步是使用统一支付接口获取:
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').$timeStamp; $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 $jsApiParameters; }
这些都是微信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 $returnXml; //==商户根据实际情况设置相应的处理流程,此处仅作举例======= //以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"); } //商户自行增加处理流程, //例如:更新订单状态 //例如:数据库操作 //例如:推送支付完成信息 } }
这里我将日志类写入.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); }
好吧,其实控制器的方法就这么多,没有别的了。我们看一下页面,直接上代码:
无需更改任何内容,只需复制即可
接下来是微信公众平台上的配置。我在这里遇到了问题。如果有同学在这里遇到问题,请留言。比如出现问题或者其他问题,这可能是因为这里的配置不正确。
请看配置过程截图:
点击修改,进入配置:
好的,是时候进行测试了:这是我的测试截图:
使用微信扫描二维码
点击微信贡献,会出现支付页面:
至此,微信支付功能已全部准备就绪。
当然,如果这是你第一次这样做,你肯定会遇到各种各样的问题。
如果您是新手,不知道为什么会遇到问题,
即使你做了之后,我相信仍然可能因为细节上的疏忽而出现问题。
但不要心急,要有耐心去发现问题。
如有疑问,请留言。下面还将介绍微信扫码支付方式1和方式2的详细教程。
微信支付教程扫码方式一:
////.htm
微信支付教程扫码方式二:
////.htm
微信支付信用卡支付教程:
////.htm
对更多相关内容感兴趣的读者可以查看本站专题:《入门教程》、《模板操作技巧总结》、《常用方法总结》、《入门教程》、《CI()框架进阶教程》 》、《Zend框架入门教程》和《PHP模板技术总结》。
希望本文所介绍的内容对大家基于框架的PHP编程有所帮助。