您现在的位置是:首页  >  PHP >  PHP基础 PHP实例

Thinkphp3.2.3微信jsapi支付实例

博主 添加时间:2019-04-11 18:34:49 【PHP实例】 热度:229人已围观

第一步:微信官网下载demo实例

下载地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 

image.png

 我们改名为 wxpay 文件夹


第二步:配置微信公众号授权页面地址

image.png

第三步:配置微信商家后台配置jsapi授权目录

image.png


第四步:配置wxpay文件夹下 -> example -> WxPay.Config.php 文件

//=======【基本信息设置】=====================================
 /**
  * TODO: 修改这里配置为您自己申请的商户信息
  * 微信公众号信息配置
  * 
  * APPID:绑定支付的APPID(必须配置,开户邮件中可查看)
  * 
  * MCHID:商户号(必须配置,开户邮件中可查看)
  * 
  */
 public function GetAppId()
 {
 return '你的appid';
 }
 public function GetMerchantId()
 {
 return '商户号';
 }
 
 
//=======【商户密钥信息-需要业务方继承】===================================
    /*
    * KEY:商户支付密钥,参考开户邮件设置(必须配置,登录商户平台自行设置), 请妥善保管, 避免密钥泄露
    * 设置地址:https://pay.weixin.qq.com/index.php/account/api_cert
    * 
    * APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置, 登录公众平台,进入开发者中心可设置), 请妥善保管, 避免密钥泄露
    * 获取地址:https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=2005451881&lang=zh_CN
    * @var string
    */
    public function GetKey()
    {
    return '你的微信公众号Key';
    }
    public function GetAppSecret()
    {
    return '你的微信公众号AppSecret';
    }

以上配置已经完成。

本人使用TP框架3.2.3来演示实例

第五步:把wxpay文件夹放到tp框架第三方类库下 地址如下

ThinkPHP/Library/Vendor/

新建一个php页面命名为 WxController.class.php

display();   
   }   
    // 支付处理    
    public function wxpay(){
        
        $tools = new JsApiPay();
        $openId = $tools->GetOpenid();
        //②、统一下单
        $input = new WxPayUnifiedOrder();
        $input->SetBody("test");
        $input->SetAttach("test");
        $input->SetOut_trade_no("sdkphp".date("YmdHis"));
        $input->SetTotal_fee("99");
        $input->SetTime_start(date("YmdHis"));
        $input->SetTime_expire(date("YmdHis", time() + 600));
        $input->SetGoods_tag("test");
        $input->SetNotify_url("http://www.jusucai.cn/Notify/index");
        $input->SetTrade_type("JSAPI");
        $input->SetOpenid($openId);
        $config = new WxPayConfig();
        $order = WxPayApi::unifiedOrder($config, $input);
        echo '
';
        $this->printf_info($order);
        $jsApiParameters = $tools->GetJsApiParameters($order);
        $this->assign('jsApiParameters' , $jsApiParameters);
        $this->display();
    }

    public function printf_info($data)
    {
        foreach($data as $key=>$value){
            echo " :  ".htmlspecialchars($value, ENT_QUOTES)." 
";
        }
    }


 }

对应的html页面 Wx控制下的wxpay方法

    [object Object]    [object Object]

这时候访问 你的地址例如 www.*******.cn/Wx/wxpay

image.png   image.png

注意:成功会弹出 OK 但是支付成功如何 业务逻辑处理 这里要说我们的回调地址

   我的回调地址     $input->SetNotify_url("http://www.jusucai.cn/Notify/index");

第六步:新建回调PHP文件

wxpageconfig = new WxPayConfig();;
        $this->WxPayNotifyReply = new WxPayNotifyReply();
    }

    public function index(){
        $msg = "OK";
        $config = $this->wxpageconfig;
        //当返回false的时候,表示notify中调用NotifyCallBack回调失败获取签名校验失败,此时直接回复失败
        $result = WxpayApi::notify($config, array($this, 'NotifyCallBack'), $msg);
        if($result == false){
            $this->WxPayNotifyReply->SetReturn_code("FAIL");
            $this->WxPayNotifyReply->SetReturn_msg($msg);
            $this->ReplyNotify(false);
            return;
        } else {
            //该分支在成功回调到NotifyCallBack方法,处理完成之后流程
            $this->WxPayNotifyReply->SetReturn_code("SUCCESS");
            $this->WxPayNotifyReply->SetReturn_msg("OK");
        }
        $this->ReplyNotify(false);
    }


    /**
     *
     * 回调方法入口,子类可重写该方法
    //TODO 1、进行参数校验
    //TODO 2、进行签名验证
    //TODO 3、处理业务逻辑
     * 注意:
     * 1、微信回调超时时间为2s,建议用户使用异步处理流程,确认成功之后立刻回复微信服务器
     * 2、微信服务器在调用失败或者接到回包为非确认包的时候,会发起重试,需确保你的回调是可以重入
     * @param WxPayNotifyResults $objData 回调解释出的参数
     * @param WxPayConfigInterface $config
     * @param string $msg 如果回调处理失败,可以将错误信息输出到该方法
     * @return true回调出来完成不需要继续回调,false回调处理未完成需要继续回调
     */
    public function NotifyProcess($objData, $config, &$msg)
    {
        $data = $objData->GetValues();
        //TODO 1、进行参数校验
        if(!array_key_exists("return_code", $data)
            ||(array_key_exists("return_code", $data) && $data['return_code'] != "SUCCESS")) {
            //TODO失败,不是支付成功的通知
            //如果有需要可以做失败时候的一些清理处理,并且做一些监控
            $msg = "异常异常";
            return false;
        }
        if(!array_key_exists("transaction_id", $data)){
            $msg = "输入参数不正确";
            return false;
        }

        //TODO 2、进行签名验证
        try {
            $checkResult = $objData->CheckSign($config);
            if($checkResult == false){
                //签名错误
                Log::ERROR("签名错误...");
                return false;
            }
        } catch(Exception $e) {
            Log::ERROR(json_encode($e));
        }

        //查询订单,判断订单真实性
        if(!$this->Queryorder($data["transaction_id"])){
            $msg = "订单查询失败";
            return false;
        }

        $order_id = $data['out_trade_no'];//这个是订单id
        //TODO 3、处理业务逻辑
        //可以根据订单号查询数据库 更改订单支付状态 比如
        
        // 更改数据库支付状态
        M('orders')->where("order_no = '{$order_id}' ")->save(array('pay_status'=>1));

        return true;
    }

    //查询订单
    public function Queryorder($transaction_id)
    {
        $input = new WxPayOrderQuery();
        $input->SetTransaction_id($transaction_id);
        $config = new WxPayConfig();
        $result = WxPayApi::orderQuery($config, $input);
        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;
    }


    /**
     *
     * 业务可以继承该方法,打印XML方便定位.
     * @param string $xmlData 返回的xml参数
     *
     **/
    public function LogAfterProcess($xmlData)
    {
        return;
    }

    /**
     *
     * notify回调方法,该方法中需要赋值需要输出的参数,不可重写
     * @param array $data
     * @return true回调出来完成不需要继续回调,false回调处理未完成需要继续回调
     */
    final public function NotifyCallBack($data)
    {
        $msg = "OK";
        $result = $this->NotifyProcess($data, $this->wxpageconfig, $msg);

        if($result == true){
            $this->WxPayNotifyReply->SetReturn_code("SUCCESS");
            $this->WxPayNotifyReply->SetReturn_msg("OK");
        } else {
            $this->WxPayNotifyReply->SetReturn_code("FAIL");
            $this->WxPayNotifyReply->SetReturn_msg($msg);
        }
        return $result;
    }

    /**
     *
     * 回复通知
     * @param bool $needSign 是否需要签名输出
     */
    final private function ReplyNotify($needSign = true)
    {
        //如果需要签名
        if($needSign == true &&
            $this->WxPayNotifyReply->GetReturn_code() == "SUCCESS")
        {
            $this->$this->WxPayNotifyReply($this->config);
        }

        $xml = $this->WxPayNotifyReply->ToXml();
        $this->LogAfterProcess($xml);
        WxpayApi::replyNotify($xml);
    }

}

 回调PHP页面只处理 NotifyProcess 方法

NotifyProcess 方法即可

在业务逻辑下处理订单支付状态即可
// 更改数据库支付状态
M('orders')->where("order_no = '{$order_id}' ")->save(array('pay_status'=>1));

然后查看我们数据库订单记录是否支付成功

image.png

到这里我们的thinkphp3.2.3微信 jsapi支付已经成功了。

实例源码 

wxpay.zip



  • 相关文章
  • 50个技巧提高你的PHP网站程序执行效率

    PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,易于学习,使用广泛,主要适用于Web开发领域。用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量, 单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的”函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故 把函数加上了双引号)。

  • PHP参考手册

    《PHP完全参考手册》是Steven Holzner编著的一本图书。该书详细介绍了如何个性化PHP工作空间,定义运算符和变量,操作字符串和数组,部署HTML表单和按钮,以及如何处理用户输入等内容。您将掌握如何访问数据库信息,用cookies跟踪客户端首选项,执行FTP和电子邮件事务,以及如何将应用程序发布到Web上。除此之外,还将深入了解PHP的下一代Web 2.0 设计功能,包括AJAX、XML和RSS。

  • PHP技术应用

    ​1,静态页面生成   2,伪静态   3,分布式   4,jquery框架集成   5,div+css w3c标准   6,大负荷   7,数据库缓存   8,过程缓存   9,flex   10,支持MVC模型   11,桌面程序应用(不擅长)

  • PHP语言优势

    1、开放的源代码。2、PHP是免费的。3、PHP的快捷性。4、跨平台性强。5、效率高。6、图像处理。7、面向对像。8、专业专注。

  • PHP特征特点

    PHP可以比CGI或者Perl更快速的执行动态网页——动态页面方面,与其他的编程语言相比,PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成htmL标记的CGI要高许多;PHP具有非常强大的功能,所有的CGI的功能PHP都能实现。

文章评论

博客名片

职业:PHP程序员

现居:河南省-洛阳市

博客地址:www.lizongyang.cn

Email:5708837@qq.com

站点信息

  • 建站时间:2019-03-25
  • 网站程序:李宗洋博客
  • 联系电话:15888888888
  • 文章统计4084篇文章
  • 标签管理标签云
  • 微信公众号:扫描二维码,关注我们

打赏本站

  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!
  • 微信扫码:你说多少就多少~
  • 支付宝扫码:你说多少就多少~

客服在线

服务时间

周一至周日 9:00-21:00