THINKPHP 3.1.3整合最新的微信支付

浏览:10451 发布日期:2015/08/10 分类:技术分享 关键字: 微信支付 thinkphp3.1
因为公司开发的需要,需要做一个客户微信系统。因为习惯于使用TP 3.1,在网上搜索了好多都是TP3.2的。实在有点不会用。折腾了两天,最后还是决定自己来。

首先从微信官方下载他们的DEMO,注意这个DEMO其实是有问题的,在开发过程中会有问题,后面会讲到。
官方DEMO下载地址:https://pay.weixin.qq.com/wiki/doc/api/download/WxpayAPI_php_v3.zip

在文件包里面我们能用到的文件如下:
lib目录下的:
WxPay.Api.php
WxPay.Config.php
WxPay.Data.php
Wxpay.Exception.php
WxPay.Notify.php(这个文件我没有用来。)
example目录下的:
WxPay.JsApiPay.php

在TP3.1的ThinkPhp->Extend->Vendor下面新建一个Weixinpay的目录。把这些文件COPY到里面。

在复制前,有几个文件的文件名要进行修改:
WxPay.JsApiPay.php文件名改为:WxPayJsApiPay.php
WxPay.Api.php文件名改为:WxPayApi.php

打开WxpayJsApiPay.php文件

将2行:require_once "../lib/WxPay.Api.php";改为:require_once "WxPayApi.php";将99行:curl_setopt($ch, CURLOP_TIMEOUT, 30);改为:curl_setopt($ch, CURLOPT_TIMEOUT, 30);这里是微信官方的一个错误,少了一个T!

打开:WxPayApi.php文件

将537,538行: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,FALSE);//严格校验
这里如果不改,会出现证书校验的错误。

好了,到这里文件改的差不多了。

接下去下载证书。

下载cert证书,这个是必需的,要不然会有问题。
在Weixinpay目录里面新建cert目录。

这个证书在:pay.weixin.qq.com 里面下载。帐户设置->api安全里面下载。把下载下来的文件复制到cert目录就可以了。

打开WxPay.Config.php文件,做配置。



好了,一切就绪,开始写Action

新建一个WeixinpaysAction.class.php文件

代码如下:<?php

Class WeixinpaysAction extends Action{

    //在类初始化方法中,引入相关类库
    public function _initialize() {
        vendor('Weixinpay.WxPayJsApiPay');

    }

    Public function index(){

        //1、获取openid
        $tools = new JsApiPay();
        $openId = $tools->GetOpenid();

        //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://test.******.com/index.php/Weixinpays/notify/");   //支付回调地址,这里改成你自己的回调地址。
        $input->SetTrade_type("JSAPI");
        $input->SetOpenid($openId);
        $order = WxPayApi::unifiedOrder($input);

        $jsApiParameters = $tools->GetJsApiParameters($order);

        $this->jsApiParameters=$jsApiParameters;

        $this->display();

    }



    //回调灵
    Public function notify(){

        //这里没有去做回调的判断,可以参考手机做一个判断。

        $xmlObj=simplexml_load_string($GLOBALS['HTTP_RAW_POST_DATA']); //解析回调数据

        $appid=$xmlObj->appid;//微信appid
        $mch_id=$xmlObj->mch_id;  //商户号
        $nonce_str=$xmlObj->nonce_str;//随机字符串
        $sign=$xmlObj->sign;//签名
        $result_code=$xmlObj->result_code;//业务结果
        $openid=$xmlObj->openid;//用户标识
        $is_subscribe=$xmlObj->is_subscribe;//是否关注公众帐号
        $trace_type=$xmlObj->trade_type;//交易类型,JSAPI,NATIVE,APP
        $bank_type=$xmlObj->bank_type;//付款银行,银行类型采用字符串类型的银行标识。
        $total_fee=$xmlObj->total_fee;//订单总金额,单位为分
        $fee_type=$xmlObj->fee_type;//货币类型,符合ISO4217的标准三位字母代码,默认为人民币:CNY。
        $transaction_id=$xmlObj->transaction_id;//微信支付订单号
        $out_trade_no=$xmlObj->out_trade_no;//商户订单号
        $attach=$xmlObj->attach;//商家数据包,原样返回
        $time_end=$xmlObj->time_end;//支付完成时间
        $cash_fee=$xmlObj->cash_fee;
        $return_code=$xmlObj->return_code;

        //下面开始你可以把回调的数据存入数据库,或者和你的支付前生成的订单进行对应了。

        //需要记住一点,就是最后在输出一个success.要不然微信会一直发送回调包的,只有需出了succcess微信才确认已接收到信息不会再发包.



    }
}
下面我是微信支付的页面index.html,代码如下:<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()
        {

            WeixinJSBridge.invoke(
                    'getBrandWCPayRequest',
                    {$jsApiParameters},
            function(res){
                WeixinJSBridge.log(res.err_msg);
                alert(res.err_code+res.err_desc+res.err_msg);  //这里是信息提示。可以加判断做跳转,支付成功后也都会回到这里提示信息。具体你可以参考手册里面的信息。
            }
        );
        }

        function callpay()
        {

            if (typeof WeixinJSBridge == "undefined"){
                alert('nul');
                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/>
<div 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>
</div>
</body>
</html>
以上页面代码基本就是微信给出的demo里面的代码。只不过把地址获取这一块给去掉了,因为我的应用不需要地址。


还有一部很关键的就是你在微信设置



在这里设置支付授权目录,授权目录要设到最后一级
如:http://test.baidu.com/index.php/Weixinpay/index/

如果这个目录设置错误,会提示appid错误的。

到这里,微信JSAPI支付基本就搞定了。

在学习thinkphp开发的过程中得到了很多朋友的帮助,所以这次自己研究出来这东西,想来想去还是放上来给大家共享。

第一次写教程,写的不是很详细,请各位见谅,如果有什么问题可以到下面我公布的QQ群里面问。我在群里面的名字是:小明

希望大家共同成长!

我们的微信开发群:422579975,代码稍后整理好会放到群文件。
最佳答案
评论( 相关
后面还有条评论,点击查看>>