• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PHP实现的微信APP支付功能示例【基于TP5框架】

    本文实例讲述了PHP实现的微信APP支付功能。分享给大家供大家参考,具体如下:

    1.进行支付请求 他给的DEMO 用的时候有时候会报错

    1)我遇到的情况 把  WxPay.Api.php这个文件的 postXmlCurl 这个 方法里

    //   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);
    
    

    这两行的严格验证给注掉

    2)有时候还会报终端IP错误  我的修改方案是 要么写死 要么注掉 他不是必填参数

    3)有时候还会报写入 日志文件 包含错误  把他的相对路径改成绝对路径就好了

    4)以下就是APP请求参数

    require_once "./payment/wxpay/php/lib/WxPay.Api.php";
    require_once "./payment/wxpay/php/example/WxPay.NativePay.php";
    $notify = new \NativePay();
    $input = new \WxPayUnifiedOrder();
    $input->SetBody("购买订单");
    $input->SetOut_trade_no($order_data['order_number']);
    $input->SetTotal_fee($zongMoney*100);
    $input->SetNonce_str($this->createNoncestr());
    $input->SetNotify_url(config('u_wx_notify_url'));
    $input->SetTrade_type('APP');
    $input->SetProduct_id(rand(10000,99999));
    $result = $notify->GetPayUrl($input);
    //我还遇到了 $result 返回值为空 也不报错
    // 然后我发现是因为我用的请求方法为 GetPayUrl()
    // 这个方法是扫码支付请求的方法 方法里有个判断
    $input->GetTrade_type() == "NATIVE"
    //这个NATIVE 是扫码支付的类型
    // 我就在这个方法里的if判断又加了一个if判断
    $input->GetTrade_type() == "APP"
    //如果他等于APP的时候就让他再次发下请求 这样就可以得到参数了
    $prepay_id = $result["prepay_id"];
    //他所范围的参数最重要的为 prepay_id 需要再进行参数加密 进入 getOrder()进行加密
    $response = $this->getOrder($prepay_id);
    // correctStatus 此函数是我自定义的 跟APP对接的 json 数据 根据自己的实际情况 定义
    $json = correctStatus($response);
    //最后输出给 APP 就好了
    echo $json;
    
    
    //执行第二次签名,才能返回给客户端使用
    public function getOrder($prepayId){
      $pay=\think\Db::name('pay_type')->where(['pay_id'=>2])->field('pay_json')->find();
      $wx=json_decode($pay['pay_json'],true);
      $data["appid"] = $wx['web_appid'];
      //createNoncestr 获取随机字符串 他写的demo里有方法 不过你也可以自定义
      $data["noncestr"] = $this->createNoncestr();
      $data["package"] = "Sign=WXPay";
      $data["partnerid"] = $wx['web_mch_id'];
      $data["prepayid"] = $prepayId;
      $data["timestamp"] = time();
      // 加密方法 getSign() 同样的 在他的demo 里也有方法  这些方法都再 WxPay.Data.php 这个文件里
      $s = $this->getSign($data,$wx['web_key']);
      $data["sign"] = $s;
      return $data;
    }
    
    
    //那些 appid key 什么的参数配置 我是直接在他的 WxPay.Config.php这个文件里写了个构造方法 直接赋值
    private $appid;
    private $mch_id;
    private $key;
    private $appsecret;
    public function __construct()
    {
        $pay=\think\Db::name('pay_type')->where(['pay_id'=>2])->field('pay_json')->find();
        $wx=json_decode($pay['pay_json'],true);
        $this->appid=$wx['web_appid'];
        $this->mch_id=$wx['web_mch_id'];
        $this->key=$wx['web_key'];
        $this->appsecret=$wx['web_appsecret'];
    }
    
    

    2.微信回调地址的处理

    //因为我 在WxPay.Config.php文件里已经赋值给了 appid 所以 这边 new 一下 就会获取所有的配置参数
    require_once "./payment/wxpay/php/lib/WxPay.Api.php";
    require_once './payment/wxpay/php/lib/WxPay.Notify.php';
    require_once './payment/wxpay/php/lib/WxPay.Data.php';
    require_once "./payment/wxpay/php/example/WxPay.Config.php";
    $config = new \WxPayConfig();
    $notify = new \WxPayNotify();
    $notify->Handle($config, false);
    //存储微信的回调
    $objData = $GLOBALS['HTTP_RAW_POST_DATA'];
    //自定义日志 函数
    log_result("【接收到的notify通知】:\n".$objData."\n");
    $data=\WxPayResults::Init($config,$objData);
    // $data = $objData->GetValues();
    //TODO 1、进行参数校验
    if(!array_key_exists("return_code", $data) || (array_key_exists("return_code", $data)  $data['return_code'] != "SUCCESS")) {
       //TODO失败,不是支付成功的通知
       //如果有需要可以做失败时候的一些清理处理,并且做一些监控
       $msg = "异常异常";
       log_result("【接收到的notify通知】:\n".$msg."\n");
       return false;
    }
    if(!array_key_exists("transaction_id", $data)){
       $msg = "输入参数不正确";
       log_result("【接收到的notify通知】:\n".$msg."\n");
       return false;
    }
    //这里可以多一步 参数 具体情况 自己定
    //TODO 2、处理业务逻辑
    
    

    以下就可以写 业余逻辑了

    更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》及《PHP模板技术总结》。

    希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

    您可能感兴趣的文章:
    • php写app用的框架整理
    上一篇:php实现的支付宝网页支付功能示例【基于TP5框架】
    下一篇:Laravel 模型关联基础教程详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    PHP实现的微信APP支付功能示例【基于TP5框架】 PHP,实现,的,微信,APP,支付,