GVKun编程网logo

thinkphp整合微信支付代码分享(thinkphp对接微信支付)

10

对于thinkphp整合微信支付代码分享感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍thinkphp对接微信支付,并为您提供关于PHP编程:Thinkphp和onethink实现微信支付插件

对于thinkphp整合微信支付代码分享感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍thinkphp对接微信支付,并为您提供关于PHP编程:Thinkphp和onethink实现微信支付插件、ThinkPHP 5 支付宝微信支付(支付宝H5,微信H5、APP支付、公众号支付)、ThinkPHP 5 整合支付宝微信支付(支付宝H5,微信H5、APP支付、公众号支付)、ThinkPHP 使用微信支付V3的有用信息。

本文目录一览:

thinkphp整合微信支付代码分享(thinkphp对接微信支付)

thinkphp整合微信支付代码分享(thinkphp对接微信支付)

本文实例为大家分享了thinkPHP整合微信支付代码,供大家参考,具体内容如下

下载:PHPwxPay(jb51.cc).rar">支付SDK

将微信支付SDK放在第三方类库vendor下面,请切记PHP里面的商户信息修改为您的公众号信息,以避免造成资金的流失。

PHP端代码

Getopenid(); $Out_Trade_no=date('YHis').rand(100,1000); $Total_fee='测试'; $Body='啥也不说'; $Total_fee=1; $input = new \WxPayUnifiedOrder(); $input->SetBody($Body); $input->Setout_Trade_no($Out_Trade_no); $input->SetTotal_fee($Total_fee); $input->SetNotify_url("http://xx.xxx.com/pay/notify.PHP"); $input->SetTrade_type("JSAPI"); $input->Setopenid($openId); $order = \WxPayApi::unifiedOrder($input); $this->jsApiParameters = $tools->GetJsApiParameters($order); $this->display(); }

HTML端代码

rush:xhtml;"> <Meta charset="UTF-8"> 微信安全支付 <Meta name="HandheldFriendly" content="True"> <Meta name="MobileOptimized" content="320"> <Meta name="format-detection" content="telephone=no"> <Meta http-equiv="cleartype" content="on">

就这么简单。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小编。

PHP编程:Thinkphp和onethink实现微信支付插件

PHP编程:Thinkphp和onethink实现微信支付插件

《ThinkPHP和onethink实现微信支付插件》要点:
本文介绍了ThinkPHP和onethink实现微信支付插件,希望对您有用。如果有疑问,可以联系我们。

PHP实例thinkPHP和微支付实现的微信支付插件,在微信中调用微信jssdk实现支付,这里有详细的代码和教程,具体看这里:

PHP实例
//实现的Wxpay钩子办法
    public function Wxpay($param){
      require './Addons/Wxpay/WxPayPubHelper/WxPayPubHelper.PHP';
      $jsApi = new \JsApi_pub(); 
       
      //=========步骤1:网页授权获取用户openid============
      if (!isset($_GET['code']))
      {
        //触发微信返回code码
        $url = $jsApi->createOauthUrlForCode(\WxPayConf_pub::JS_API_CALL_URL.'/order_id/'.$param['order_id']);
        Header("Location: $url");
      }else
      {
        $order_id = $param['order_id'];
        $info = M('Order')->where('id='.$order_id)->find();
        if(empty($info) || $info['is_pay'] == 1){
          dump('该订单不存在或已支付'.$order_id);
          exit();
        }
        $this->assign('info',$info);
        $a = $info['money'];
        $b = 100;
        $c = $a * $b;
         
        //获取code码,以获取openid
        $code = $_GET['code'];
        $jsApi->setCode($code);
        $openid = $jsApi->getopenId();
      }
       
      //=========步骤2:使用统一支付接口,获取prepay_id============
      //使用统一支付接口
      $unifiedOrder = new \UnifiedOrder_pub();
       
      $unifiedOrder->setParameter("openid","$openid");//商品描述
      $unifiedOrder->setParameter("body","在线预订");//商品描述
      //自定义订单号,此处仅作举例
      $timeStamp = time();
//       $out_Trade_no = \WxPayConf_pub::APPID."$timeStamp";
      $out_Trade_no = $info['ordersn'];
      $unifiedOrder->setParameter("out_Trade_no","$out_Trade_no");//商户订单号
      $unifiedOrder->setParameter("total_fee","$c");//总金额
      $unifiedOrder->setParameter("notify_url",\WxPayConf_pub::NOTIFY_URL.'/order_id/'.$param['order_id']);//通知地址
      $unifiedOrder->setParameter("Trade_type","JSAPI");//交易类型
       
      $prepay_id = $unifiedOrder->getPrepayId();
      //=========步骤3:使用jsapi调起支付============
      $jsApi->setPrepayId($prepay_id);
      $jsApiParameters = $jsApi->getParameters();
      $this->assign('jsApiParameters',$jsApiParameters);
 
      $this->display('pay');
    }

PHP实例以上就是本文的全部内容,希望对大家学习PHP程序设计有所帮助.

小编培训学院每天发布《ThinkPHP和onethink实现微信支付插件》等实战技能,PHP、MysqL、LINUX、APP、JS,CSS全面培养人才。

ThinkPHP 5 支付宝微信支付(支付宝H5,微信H5、APP支付、公众号支付)

ThinkPHP 5 支付宝微信支付(支付宝H5,微信H5、APP支付、公众号支付)

 Pay.php支付控制器

<?php
// +----------------------------------------------------------------------
// | YFCMS [ WE CAN DO IT MORE SIMPLE ]
// +----------------------------------------------------------------------
// | Copyright (c) 2015-2016 http://xueding.vip All rights reserved.
// +----------------------------------------------------------------------
// | Author: XueDing_ <361169632@qq.com>
// +----------------------------------------------------------------------
namespace app\phone\controller;

use think\Db;
use think\Request;
use think\Session;
use think\Cookie;
use app\phone\model\Weixin;
use app\phone\model\Weixin_pay;
use app\phone\model\Alipay;

class Pay extends controller
{
    public function _initialize()
    {
        $this->alipay_config = array(
            //应用ID,您的APPID。
            ''app_id'' => ''your app_id'',
            //支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
            ''alipay_public_key'' => ''your alipay_public_key'',
            //商户私钥,您的原始格式RSA私钥
            ''merchant_private_key'' => ''your merchant_private_key'',
            //异步通知地址
            ''notify_url'' => "your notify_url",
            //同步跳转
            ''return_url'' => "your return_url",
            //编码格式
            ''charset'' => "UTF-8",
            //签名方式
            ''sign_type'' => "RSA2",
            //支付宝网关
            ''gatewayUrl'' => "https://openapi.alipay.com/gateway.do",
            //支付宝partner,2088开头数字
            ''partner'' => ''your partner'',
            //支付宝密钥
            ''md5_key'' => ''your key''
        );
        $this->wechat_config = array(
            //您的APPID
            ''app_id'' => ''your app_id'',
            //您的md5_key
            ''md5_key'' => ''your md5_key'',
            //您的mch_id
            ''mch_id'' => ''your mch_id'',
            //您的appsecret
            ''appsecret'' => ''your appsecret'',
            //您的回调地址可以在这里配置使用方法的时候传,也可以在模型里面配置。
            ''notify_url'' => ''your notify_url'',
        );
    }

    /*
    微信h5支付
     */
    public function wechat_pay()
    {
        if (input(''post.token'') == TOKEN) {
            // 判断用户是在微信浏览器打开还是其他浏览器打开。
            $userAgent = $_SERVER[''HTTP_USER_AGENT''];
            if (strpos($userAgent, ''MicroMessenger'')) {
                $wechat = new Weixin($this->wechat_config[''appsecret''], $this->wechat_config[''app_id'']);
                $wechat_pay = new Weixin_pay($this->wechat_config[''appsecret''], $this->wechat_config[''app_id''], $this->wechat_config[''md5_key''], $this->wechat_config[''mch_id'']);
                $code = input(''post.code'');
                if (session::has(''openid'')) {
                    $openid = session::get(''openid'');
                    $total_fee = 1;
                    $out_trade_no = ''12345678945641231'';
                    $body = "充值金币支付测试";
                    $res = $wechat_pay->pay($openid, $total_fee, $body, $out_trade_no);
                    $arr[''errcode''] = ''0'';
                    $arr[''errmsg''] = ''ok'';
                    $arr[''url''] = ''本控制器下的地址/'' . ''wx?data='' . $res;
                    $data = json_encode($arr);
                } else {
                    if (!empty($code)) {
                        $res = $wechat->get_access_token($code);
                        $userinfo = $wechat->get_openid_userinfo($res[''access_token''], $res[''openid'']);
                        $openid = $userinfo[''openid''];
                        session::set(''openid'', $openid);
                        $total_fee = 1;
                        $out_trade_no = ''12345678945641231'';
                        $body = "充值金币支付测试";
                        $res = $wechat_pay->pay($openid, $total_fee, $body, $out_trade_no);
                        $arr[''errcode''] = ''0'';
                        $arr[''errmsg''] = ''ok'';
                        $arr[''url''] = ''本控制器下的地址/'' . ''wx?data='' . $res;
                        $data = json_encode($arr);
                    } else {
                        $link = ''http://'' . $_SERVER[''HTTP_HOST''] . ''/#/cz''; // 前端充值金币页面地址。
                        cookie::set(''url'', $link, 300);
                        //$link 这个地址是在微信打开你项目时才会需要的,地址后面带上获取的code进行获取access_token。
                        $res = $wechat->code_shouquan($link);
                        $arr[''errcode''] = ''0'';
                        $arr[''errmsg''] = ''ok'';
                        $arr[''url''] = $res;
                        $data = json_encode($arr);
                    }
                }
            } else {
                //非微信浏览器
                $wechat_pay = new Weixin_pay($this->wechat_config[''appsecret''], $this->wechat_config[''app_id''], $this->wechat_config[''md5_key''], $this->wechat_config[''mch_id'']);
                //h5支付不用传递openid 此处与微信jsapi支付不同
                $openid = "";
                $total_fee = 1;
                $out_trade_no = ''12345678945641231'';
                $body = "充值金币h5支付测试";
                $res = $wechat_pay->payh5($openid, $total_fee, $body, $out_trade_no);
                $arr[''errcode''] = ''0'';
                $arr[''errmsg''] = ''ok'';
                $arr[''url''] = $res[''mweb_url''];//微信唤起H5支付地址
                $data = json_encode($arr);
            }
        } else {
            $data = ''{"errcode":"1001","errmsg":"TOKEN无效"}'';
        }
        echo $data;
    }

    /*
    在微信打开的时候唤起微信公众号支付。
    */
    public function wx()
    {
        $data = input(''get.data'');
        $this->assign(''data'', $data);
        return view();
    }

    /*
    获取微信code
     */
    public function code()
    {
        $code = input(''param.code'');
        $this->redirect(cookie::get(''url'') . ''?code='' . $code);
    }

    /*
    微信回调
    */
    public function wechat_notify()
    {
        $ccc = file_get_contents(''php://input'');
        $Weixin_pay = new Weixin_pay();
        $data = $Weixin_pay->xmlToArray($ccc);
        if ($data[''result_code''] == ''SUCCESS'' && $data[''return_code''] == ''SUCCESS'') {
            //获取订单号
            $Ordersn = $data[''out_trade_no''];//订单号
            // 处理支付成功后的逻辑业务
        }
    }

    /*
    微信APP支付
     */
    public function app_wechat_pay()
    {
        if (input(''post.token'') == TOKEN) {
            $wechat_pay = new Weixin_pay($this->wechat_config[''appsecret''], $this->wechat_config[''app_id''], $this->wechat_config[''md5_key''], $this->wechat_config[''mch_id'']);
            //h5支付不用传递openid 此处与微信jsapi支付不同
            $openid = "";
            $total_fee = 1;
            $body = "充值金币APP支付测试";
            $order_sn = 123456789;//订单号
            $res = $wechat_pay->app_pay($body, $order_sn, $total_fee);
            if ($res[''prepay_id'']) {//判断返回参数中是否有prepay_id
                $order = $wechat_pay->getOrder($res[''prepay_id'']);//执行二次签名返回参数
                $arr[''errcode''] = ''0'';
                $arr[''errmsg''] = ''ok'';
                $arr[''order''] = $order;
                $data = json_encode($arr);
            } else {
                $arr[''errcode''] = ''1003'';
                $arr[''errmsg''] = $res[''err_code_des''];
                $data = json_encode($arr);
            }
        } else {
            $data = ''{"errcode":"1001","errmsg":"TOKEN无效"}'';
        }
        echo $data;
    }

    /*
    支付宝开始支付
    */
    public function alipay()
    {//发起支付宝支付
        if (input(''post.token'') == TOKEN) {
            $link = ''http://'' . $_SERVER[''HTTP_HOST''] . ''/#/cz'';
            cookie::set(''url'', $link, 300);
            $res[''out_trade_no''] = 123456798123;
            $res[''subject''] = ''充值'';
            $res[''body''] = ''测试'';
            $res[''money''] = 0.01;
            $Pay = new Alipay($this->alipay_config[''partner''], $this->alipay_config[''md5_key'']);
            $result = $Pay->alipay([
                ''notify_url'' => ''your notify_url'',
                ''return_url'' => ''your return_url'',
                ''out_trade_no'' => $res[''out_trade_no''],
                ''subject'' => $res[''subject''],
                ''total_fee'' => $res[''money''],
                ''body'' => $res[''body''],
            ]);
            $arr[''errcode''] = ''0'';
            $arr[''errmsg''] = ''ok'';
            return $result[''msg''];
        } else {
            $data = ''{"errcode":"1001","errmsg":"TOKEN无效"}'';
        }
        echo $data;
    }

    /*
    支付宝回调
    */
    public function alipay_notify()
    {//异步订单通知
        $wx = sys_config_get(''payment'');
        $Pay = new Alipay($wx[''aliwappay''][''partner''], $wx[''aliwappay''][''md5_key'']);
        $out_trade_no = input(''out_trade_no'');
        $trade_status = input(''trade_status'');
        if ($trade_status == ''TRADE_SUCCESS'') {
            // 处理支付成功后的逻辑业务

        } else {
            // 处理支付失败后的逻辑业务
        }
    }
}

模型:Weixin.php

<?php

namespace app\phone\model;

use think\Db;
use think\Validate;
use think\Loader;
use think\Model;

class Weixin extends model
{
    protected $appScrect;
    protected $appId;

    public function __construct($appScrect = "", $appId = "")
    {
        $this->appScrect = $appScrect;
        $this->appId = $appId;
    }

    /*
     * 因为本项目需求,前端是Vue后台是TP5两个项目不在一个服务器所以我的url是return 回控制器通过接口返回给前端
     * 如果是正常html页面可以使用header("Location: $url"); 以下方法都是
     * */
    public function code_shouquan($link)
    {
        $redirect_uri = urlencode(''网址/pay/code'');//微信获取网页授权地址
        // 1、引导用户进入授权页面同意授权,获取code
        // 2、通过code换取网页授权access_token
        // 3、如果需要,开发者可以刷新网页授权access_token,避免过期
        // 4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)
        $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" . $this->appId . "&redirect_uri=" . $redirect_uri . "&response_type=code&scope=snsapi_userinfo&state=1234#wechat_redirect";
        return $url;
    }


    public function get_access_token($code)
    {

        //检测缓存中是否有access_token(2小时),如果存在直接返回,不存在则检测缓存中的refresh_token(30天),
        // refresh_token如果存在调用刷新缓存;如果不存在重新发起授权code授权
        $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . $this->appId . "&secret=" . $this->appScrect . "&code=" . $code . "&grant_type=authorization_code";
        $res = $this->sendRequest($url);
        return $res;
    }

    public function get_refresh_token($refresh_token)
    {

        $url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" . $this->appId . "&grant_type=refresh_token&refresh_token=" . $refresh_token;
        $res = $this->sendRequest($url);
        return $res;
    }

    public function get_openid_userinfo($access_token, $openid)
    {
        $url = "https://api.weixin.qq.com/sns/userinfo?access_token=" . $access_token . "&openid=" . $openid . "&lang=zh_CN";
        $res = $this->sendRequest($url);
        return $res;
    }

    /*
   发送请求
    */
    public function sendRequest($url)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($ch);
        curl_close($ch);
        return json_decode($output, true);
    }
}

Weixin.php

<?php
namespace app\phone\model;
use think\Db;
use think\Validate;
use think\Loader;
use think\Model;

class Weixin_pay extends model
{
    protected $appScrect;//微信公众平台的appscrect
    protected $appId;//微信公众平台appid
    protected $key;//微信商户平台配置的秘钥
    protected $mch_id;//微信商户号
    protected $values = array();

    public function __construct($appScrect="",$appId="", $key="",$mch_id =''''){
        $this->appScrect=$appScrect;
        $this->appId=$appId;
        $this->key=$key;
        $this->mch_id=$mch_id;

    }
    public function app_pay($body, $out_trade_no, $total_fee){
        $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
        $notify_url = '''';//可以在这填写回调地址也可以增加一个参数传过来。也可以直接在构造里面加一个notify_url地址
        $onoce_str = $this->createNoncestr();
        $data["appid"] = $this->appId;
        $data["body"] = $body;
        $data["mch_id"] = $this->mch_id;
        $data["nonce_str"] = $onoce_str;
        $data["notify_url"] = $notify_url;
        $data["out_trade_no"] = $out_trade_no;
        $data["spbill_create_ip"] = $this->get_client_ip();
        $data["total_fee"] = $total_fee;
        $data["trade_type"] = "APP";
        $sign = $this->getSign($data);
        $data["sign"] = $sign;
        $xml = $this->arrayToXml($data);
        $response = $this->postXmlCurl($xml, $url);
        // return $xml;
        //将微信返回的结果xml转成数组
        $response = $this->xmlToArray($response);
        //返回数据
        return $response;
    }
    //执行第二次签名,才能返回给客户端使用
    public function getOrder($prepayId){
        $data["appid"] = $this->appId;
        $data["noncestr"] = $this->createNoncestr();;
        $data["package"] = "Sign=WXPay";
        $data["partnerid"] = $this->mch_id;
        $data["prepayid"] = $prepayId;
        $data["timestamp"] = time();
        $s = $this->getSign($data, false);
        $data["sign"] = $s;
        return $data;
    }
    /*
    公众号支付
     */
    public function pay($openid,$total_fee,$body,$out_trade_no){
        $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
        $notify_url = '''';
        $onoce_str = $this->createNoncestr();
        $data["appid"] = $this->appId;
        $data["body"] = $body;
        $data["mch_id"] = $this->mch_id;
        $data["nonce_str"] = $onoce_str;
        $data["notify_url"] = $notify_url;
        $data["out_trade_no"] = $out_trade_no;
        $data["spbill_create_ip"] = $this->get_client_ip();
        $data["total_fee"] = $total_fee;
        $data["trade_type"] = "JSAPI";
        $data["openid"] = $openid;
        $sign = $this->getSign($data);
        $data["sign"] = $sign;
        $xml = $this->arrayToXml($data);
        $response = $this->postXmlCurl($xml, $url);
        //将微信返回的结果xml转成数组
        $response = $this->xmlToArray($response);
        $jsapi=array();
        $timeStamp = time();
        $jsapi[''appId'']=($response["appid"]);    
        $jsapi[''timeStamp'']=("$timeStamp");
        $jsapi[''nonceStr'']=($this->createNoncestr());
        $jsapi[''package'']=("prepay_id=" . $response[''prepay_id'']);
        $jsapi[''signType'']=("MD5");
        $jsapi[''paySign'']=($this->getSign($jsapi));
        $parameters = json_encode($jsapi);
        // halt($jsapi);
        //请求数据,统一下单  
        return $parameters; 
    }

    public function payh5($openid,$total_fee,$body,$out_trade_no){
        $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
        $notify_url = '''';
        $onoce_str = $this->createNoncestr();
        $data["appid"] = $this->appId;
        $data["body"] = $body;
        $data["mch_id"] = $this->mch_id;
        $data["nonce_str"] = $onoce_str;
        $data["notify_url"] = $notify_url;
        $data["out_trade_no"] = $out_trade_no;
        $data["spbill_create_ip"] = $this->get_client_ip();
        $data["total_fee"] = $total_fee;
        $data["trade_type"] = "MWEB";
        $data["scene_info"] = "{''h5_info'': {''type'':''Wap'',''wap_url'':  $notify_url,''wap_name'': ''测试充值''}}";
        $sign = $this->getSign($data);
        $data["sign"] = $sign;
        $xml = $this->arrayToXml($data);
        // return $data;
        $response = $this->postXmlCurl($xml, $url);
        //将微信返回的结果xml转成数组
        $response = $this->xmlToArray($response);
        //请求数据,统一下单  
        return $response; 
    }

    public static function getNonceStr($length = 32)
    {
        $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
        $str ="";
        for ( $i = 0; $i < $length; $i++ )  {
            $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1);
        }
        return $str;
    }

    //   /*生成签名*/
    public function getSign($Obj){
        foreach ($Obj as $k => $v){
            $Parameters[$k] = $v;
        }
        //签名步骤一:按字典序排序参数
        ksort($Parameters);
        $String = $this->formatBizQueryParaMap($Parameters, false);
        //echo ''【string1】''.$String.''</br>'';
        //签名步骤二:在string后加入KEY
        $String = $String."&key=".$this->key;
        //echo "【string2】".$String."</br>";
        //签名步骤三:MD5加密
        $String = md5($String);
        //echo "【string3】 ".$String."</br>";
        //签名步骤四:所有字符转为大写
        $result_ = strtoupper($String);
        //echo "【result】 ".$result_."</br>";
        return $result_;
    }
 
 
    /**
    *  作用:产生随机字符串,不长于32位
    */
    public function createNoncestr( $length = 32 ){
        $chars = "abcdefghijklmnopqrstuvwxyz0123456789"; 
        $str ="";
        for ( $i = 0; $i < $length; $i++ )  { 
            $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1); 
        } 
        return $str;
    }
 
 
    //数组转xml
    public function arrayToXml($arr){
        $xml = "<xml>";
        foreach ($arr as $key=>$val){
            if (is_numeric($val)){
                $xml.="<".$key.">".$val."</".$key.">";
            }else{
                $xml.="<".$key."><![CDATA[".$val."]]></".$key.">"; 
            }
        }
        $xml.="</xml>";
        return $xml;
    }
 
       
    /**
    *  作用:将xml转为array
    */
    public function xmlToArray($xml){  
        //将XML转为array       
        $array_data = json_decode(json_encode(simplexml_load_string($xml, ''SimpleXMLElement'', LIBXML_NOCDATA)), true);
        return $array_data;
    }
 
 
    /**
    *  作用:以post方式提交xml到对应的接口url
    */
    public function postXmlCurl($xml,$url,$second=30){  
        //初始化curl       
        $ch = curl_init();
        //设置超时
        curl_setopt($ch, CURLOPT_TIMEOUT, $second);
        //这里设置代理,如果有的话
        //curl_setopt($ch,CURLOPT_PROXY, ''8.8.8.8'');
        //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
        curl_setopt($ch,CURLOPT_URL, $url);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
        //设置header
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
        //要求结果为字符串且输出到屏幕上
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        //post提交方式
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
        //运行curl
        $data = curl_exec($ch);
        //返回结果
 
        if($data){
            curl_close($ch);
            return $data;
        }else{
            $error = curl_errno($ch);
            echo "curl出错,错误码:$error"."<br>";
            curl_close($ch);
            return false;
        }
    }
 
 
    /*
    获取当前服务器的IP
    */
    public function get_client_ip(){
        if(getenv(''HTTP_CLIENT_IP'') && strcasecmp(getenv(''HTTP_CLIENT_IP''),''unknown'')) {

            $ip = getenv(''HTTP_CLIENT_IP'');

        } elseif(getenv(''HTTP_X_FORWARDED_FOR'') && strcasecmp(getenv(''HTTP_X_FORWARDED_FOR''),''unknown'')) {

            $ip = getenv(''HTTP_X_FORWARDED_FOR'');

        } elseif(getenv(''REMOTE_ADDR'') && strcasecmp(getenv(''REMOTE_ADDR''),''unknown'')) {

            $ip = getenv(''REMOTE_ADDR'');

        } elseif(isset($_SERVER[''REMOTE_ADDR'']) && $_SERVER[''REMOTE_ADDR''] && strcasecmp($_SERVER[''REMOTE_ADDR''], ''unknown'')) {

            $ip = $_SERVER[''REMOTE_ADDR''];

        }

        return preg_match ( ''/[\d\.]{7,15}/'', $ip, $matches ) ? $matches [0] : '''';
    }
     
 
    /**
    *  作用:格式化参数,签名过程需要使用
    */
    public function formatBizQueryParaMap($paraMap, $urlencode){
        $buff = "";
        ksort($paraMap);
        foreach ($paraMap as $k => $v){
            if($urlencode){
                $v = urlencode($v);
            }
            $buff .= $k . "=" . $v . "&";
        }
        $reqPar;
        if (strlen($buff) > 0){
            $reqPar = substr($buff, 0, strlen($buff)-1);
        }
        return $reqPar;
    }
    
        public function MakeSign($unifiedorder)
    {
        $this->values=$unifiedorder;
        //签名步骤一:按字典序排序参数
        // ksort($this->values);
        $string = $this->ToUrlParams();
        //halt($string);
        //签名步骤二:在string后加入KEY
        $string = $string . "&key=".$this->key;
        //签名步骤三:MD5加密
        $string = md5($string);
        //签名步骤四:所有字符转为大写
        $result = strtoupper($string);
        return $result;
    }

    public function ToUrlParams()
    {
        $buff = "";
        foreach ($this->values as $k => $v)
        {
            if($k != "sign" && $v != "" && !is_array($v)){
                $buff .= $k . "=" . $v . "&";
            }
        }
        $buff = trim($buff, "&");
        return $buff;
    }


          function array2xml($array)
    {
        $xml=''<xml>'';
        foreach($array as $key=>$val){
            if(is_numeric($key)){
                $key="item id=\"$key\"";
            }else{
                //去掉空格,只取空格之前文字为key
                list($key,)=explode('' '',$key);
            } 
            $xml.="<$key>";
            $xml.=is_array($val)?$this->_array2xml($val):$val;
            //去掉空格,只取空格之前文字为key
            list($key,)=explode('' '',$key);
            $xml.="</$key>";
            
        }
            $xml.="</xml>";

        return $xml;
    }

       function xml2array($xml)
    {    
        //禁止引用外部xml实体
        libxml_disable_entity_loader(true);
        $values = json_decode(json_encode(simplexml_load_string($xml, ''SimpleXMLElement'', LIBXML_NOCDATA)), true);  
        return $values;
    }

    
    public  function request_post($url = '''', $param = '''')
    {
        if (empty($url) || empty($param)) {
            return false;
        }
        $postUrl = $url;
        $curlPost = $param;
        $ch = curl_init(); //初始化curl
        curl_setopt($ch, CURLOPT_URL, $postUrl); //抓取指定网页
        curl_setopt($ch, CURLOPT_HEADER, 0); //设置header
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //要求结果为字符串且输出到屏幕上
        curl_setopt($ch, CURLOPT_POST, 1); //post提交方式
        curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
        $data = curl_exec($ch); //运行curl
        curl_close($ch);
        return $data;
    }

    function curl_post_ssl($url, $vars, $second=30,$aHeader=array())
    {
        $ch = curl_init();
        //curl_setopt($ch,CURLOPT_VERBOSE,''1'');
        curl_setopt($ch,CURLOPT_TIMEOUT,$second);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
        curl_setopt($ch,CURLOPT_SSLCERTTYPE,''PEM'');
        curl_setopt($ch,CURLOPT_SSLCERT,''/data/cert/php.pem'');
        curl_setopt($ch,CURLOPT_SSLCERTPASSWD,''1234'');
        curl_setopt($ch,CURLOPT_SSLKEYTYPE,''PEM'');
        curl_setopt($ch,CURLOPT_SSLKEY,''/data/cert/php_private.pem'');
        if( count($aHeader) >= 1 ){
                curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
        }
        curl_setopt($ch,CURLOPT_POST, 1);
        curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);
        $data = curl_exec($ch);
        curl_close($ch);
        if($data){
            return $data;
        }else{
            return false;
        }
    }
}

Alipay.php

<?php
namespace app\phone\model;

use think\Validate;
use think\Log;
use think\Model;
use lib\AlipaySubmit;

class Alipay extends Model
{
    protected $partner;
    protected $md5_key;

    public function __construct($partner = "", $md5_key = "")
    {
        $this->partner = $partner;
        $this->md5_key = $md5_key;
    }

    public static $alipay_config = [
        // ''partner''         => '''',//支付宝partner,2088开头数字
        // ''seller_id''         => '''',//支付宝partner,2088开头数字
        // ''key''             => '''',//支付宝密钥
        ''sign_type'' => ''MD5'',
        ''input_charset'' => ''utf-8'',
        ''cacert'' => '''',
        ''transport'' => ''http'',
        ''payment_type'' => ''1'',
        ''service'' => '''',//https://docs.open.alipay.com/api_1  看你需要哪个API接口
        ''anti_phishing_key'' => '''',
        ''exter_invoke_ip'' => '''',
        ''app_pay'' => ''Y'',
    ];

    public function alipay($data = [])
    {//发起支付宝支付
        $validate = new Validate([
            [''out_trade_no'', ''require|alphaNum'', ''订单编号输入错误1|订单编号输入错误2''],
            [''total_fee'', ''require|number|gt:0'', ''金额输入错误|金额输入错误|金额输入错误''],
            [''subject'', ''require'', ''请输入标题''],
            [''body'', ''require'', ''请输入描述''],
            [''notify_url'', ''require'', ''异步通知地址不为空''],
        ]);
        if (!$validate->check($data)) {
            return [''code'' => 0, ''msg'' => $validate->getError()];
        }
        $config = self::$alipay_config;
        $config[''partner''] = $this->partner;
        $config[''seller_id''] = $this->partner;
        $config[''key''] = $this->md5_key;
        vendor(''alipay.alipay'');
        $parameter = [
            "service" => $config[''service''],
            "partner" => $config[''partner''],
            "seller_id" => $config[''seller_id''],
            "payment_type" => $config[''payment_type''],
            "notify_url" => $data[''notify_url''],
            "return_url" => $data[''return_url''],
            "anti_phishing_key" => $config[''anti_phishing_key''],
            "exter_invoke_ip" => $config[''exter_invoke_ip''],
            "out_trade_no" => $data[''out_trade_no''],
            "subject" => $data[''subject''],
            "total_fee" => $data[''total_fee''],
            "body" => $data[''body''],
            "_input_charset" => $config[''input_charset''],
            ''app_pay'' => ''Y'',

        ];
        $alipaySubmit = new AlipaySubmit($config);
        return [''code'' => 1, ''msg'' => $alipaySubmit->buildRequestForm($parameter, "get", "确认")];
    }
}

?>

支付宝需要的submit文件:点击下载

wx.html在使用微信客户端支付时需要的页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>微信公众号支付</title>
</head>
<body>
<script>
    function getOrder() {
        onBridgeReady();
    }
    function onBridgeReady() {
        var data = {$data};
        WeixinJSBridge.invoke(
            ''getBrandWCPayRequest'', data,
            function (res) {
                if (res.err_msg == "get_brand_wcpay_request:ok") {
                    // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回    ok,但并不保证它绝对可靠。
                    location.href = ''http://book.yueyuecms.com/#/me''
                } else {
                    // alert(res.err_code+res.err_desc+res.err_msg); // 显示错误信息
                    location.href = ''http://book.yueyuecms.com/#/me''
                }
            }
        );
    }
    if (typeof WeixinJSBridge == "undefined") {
        if (document.addEventListener) {
            document.addEventListener(''WeixinJSBridgeReady'', onBridgeReady, false);
        } else if (document.attachEvent) {
            document.attachEvent(''WeixinJSBridgeReady'', onBridgeReady);
            document.attachEvent(''onWeixinJSBridgeReady'', onBridgeReady);
        }
    } else {
        onBridgeReady();
    }
</script>
</body>
</html>

 

Author:XueDing_
Email:361169632@qq.com
注明出处:https://www.cnblogs.com/best-always/p/10291310.html

 

ThinkPHP 5 整合支付宝微信支付(支付宝H5,微信H5、APP支付、公众号支付)

ThinkPHP 5 整合支付宝微信支付(支付宝H5,微信H5、APP支付、公众号支付)

 Pay.PHP支付控制器

PHP copyright (c) 2015-2016 http://xueding.vip All rights reserved. // +---------------------------------------------------------------------- // | Author: XueDing_ <361169632@qq.com> // +---------------------------------------------------------------------- <span>use<span> think\Db;
<span>use<span> think\Request;
<span>use<span> think\Session;
<span>use<span> think\Cookie;
<span>use<span> app\phone\model\<span>Weixin;
<span>use<span> app\phone\model\<span>Weixin_pay;
<span>use<span> app\phone\model\<span>Alipay;

<span>class Pay <span>extends<span> controller
{
<span>public <span>function<span> _initialize()
{
<span>$this->alipay_config = <span>array<span>(
<span>//<span>应用ID,您的APPID。
'app_id' => '<span>your app_id',<span>//<span>支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
'alipay_public_key' => '<span>your alipay_public_key',<span>//<span>商户私钥,您的原始格式RSA私钥
'merchant_private_key' => '<span>your merchant_private_key',<span>//<span>异步通知地址
'notify_url' => "<span>your notify_url",<span>//<span>同步跳转
'return_url' => "<span>your return_url",<span>//<span>编码格式
'charset' => "UTF-8",<span>//<span>签名方式
'sign_type' => "RSA2",<span>//<span>支付宝网关
'gatewayUrl' => "https://openapi.alipay.com/gateway.do",<span>//<span>支付宝partner,2088开头数字
'partner' => '<span>your partner',<span>//<span>支付宝密钥
'md5_key' => '<span>your key'<span>
);
<span>$this->wechat_config = <span>array<span>(
<span>//<span>您的APPID
'app_id' => '<span>your app_id',<span>//<span>您的md5_key
'md5_key' => '<span>your md5_key',<span>//<span>您的mch_id
'mch_id' => '<span>your mch_id',<span>//<span>您的appsecret
'appsecret' => '<span>your appsecret',<span>//<span>您的回调地址可以在这里配置使用方法的时候传,也可以在模型里面配置。
'notify_url' => '<span>your notify_url',<span>
);
}

</span><span&gt;/*</span><span&gt;
微信h5支付
 </span><span&gt;*/</span>
<span&gt;public</span> <span&gt;function</span><span&gt; wechat_pay()
{
    </span><span&gt;if</span> (input('post.token') ==<span&gt; TOKEN) {
        </span><span&gt;//</span><span&gt; 判断<a href="https://www.jb51.cc/tag/yonghu/" target="_blank">用户</a>是在微信浏览器打开还是其他浏览器打开。</span>
        <span&gt;$userAgent</span> = <span&gt;$_SERVER</span>['HTTP_USER_AGENT'<span&gt;];
        </span><span&gt;if</span> (<span&gt;strpos</span>(<span&gt;$userAgent</span>,'MicroMessenger'<span&gt;)) {
            </span><span&gt;$wechat</span> = <span&gt;new</span> Weixin(<span&gt;$this</span>->wechat_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>['appsecret'],<span&gt;$this</span>->wechat_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>['app_id'<span&gt;]);
            </span><span&gt;$wechat_pay</span> = <span&gt;new</span> Weixin_pay(<span&gt;$this</span>->wechat_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>['appsecret'],<span&gt;$this</span>->wechat_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>['app_id'],<span&gt;$this</span>->wechat_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>['md5_key'],<span&gt;$this</span>->wechat_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>['mch_id'<span&gt;]);
            </span><span&gt;$code</span> = input('post.code'<span&gt;);
            </span><span&gt;if</span> (session::has('openid'<span&gt;)) {
                </span><span&gt;$openid</span> = session::get('openid'<span&gt;);
                </span><span&gt;$total_fee</span> = 1<span&gt;;
                </span><span&gt;$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span> = '12345678945641231'<span&gt;;
                </span><span&gt;$body</span> = "充值金币支付测试"<span&gt;;
                </span><span&gt;$res</span> = <span&gt;$wechat_pay</span>->pay(<span&gt;$openid</span>,<span&gt;$total_fee</span>,<span&gt;$body</span>,<span&gt;$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span><span&gt;);
                </span><span&gt;$arr</span>['errcode'] = '0'<span&gt;;
                </span><span&gt;$arr</span>['errmsg'] = 'ok'<span&gt;;
                </span><span&gt;$arr</span>['url'] = '本控制器下的地址/' . 'wx?data=' . <span&gt;$res</span><span&gt;;
                </span><span&gt;$data</span> = json_encode(<span&gt;$arr</span><span&gt;);
            } </span><span&gt;else</span><span&gt; {
                </span><span&gt;if</span> (!<span&gt;empty</span>(<span&gt;$code</span><span&gt;)) {
                    </span><span&gt;$res</span> = <span&gt;$wechat</span>->get_access_token(<span&gt;$code</span><span&gt;);
                    </span><span&gt;$userinfo</span> = <span&gt;$wechat</span>->get_openid_userinfo(<span&gt;$res</span>['access_token'],<span&gt;$res</span>['openid'<span&gt;]);
                    </span><span&gt;$openid</span> = <span&gt;$userinfo</span>['openid'<span&gt;];
                    session</span>::set('openid',<span&gt;$openid</span><span&gt;);
                    </span><span&gt;$total_fee</span> = 1<span&gt;;
                    </span><span&gt;$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span> = '12345678945641231'<span&gt;;
                    </span><span&gt;$body</span> = "充值金币支付测试"<span&gt;;
                    </span><span&gt;$res</span> = <span&gt;$wechat_pay</span>->pay(<span&gt;$openid</span>,<span&gt;$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span><span&gt;);
                    </span><span&gt;$arr</span>['errcode'] = '0'<span&gt;;
                    </span><span&gt;$arr</span>['errmsg'] = 'ok'<span&gt;;
                    </span><span&gt;$arr</span>['url'] = '本控制器下的地址/' . 'wx?data=' . <span&gt;$res</span><span&gt;;
                    </span><span&gt;$data</span> = json_encode(<span&gt;$arr</span><span&gt;);
                } </span><span&gt;else</span><span&gt; {
                    </span><span&gt;$link</span> = 'http://' . <span&gt;$_SERVER</span>['HTTP_HOST'] . '/#/cz'; <span&gt;//</span><span&gt; 前端充值金币<a href="https://www.jb51.cc/tag/yemiandizhi/" target="_blank">页面地址</a>。</span>
                    cookie::set('url',<span&gt;$link</span>,300<span&gt;);
                    </span><span&gt;//</span><span&gt;$link 这个地址是在微信打开你项目时才会需要的,地址后面带上<a href="https://www.jb51.cc/tag/huoqu/" target="_blank">获取</a>的code进行<a href="https://www.jb51.cc/tag/huoqu/" target="_blank">获取</a>access_token。</span>
                    <span&gt;$res</span> = <span&gt;$wechat</span>->code_shouquan(<span&gt;$link</span><span&gt;);
                    </span><span&gt;$arr</span>['errcode'] = '0'<span&gt;;
                    </span><span&gt;$arr</span>['errmsg'] = 'ok'<span&gt;;
                    </span><span&gt;$arr</span>['url'] = <span&gt;$res</span><span&gt;;
                    </span><span&gt;$data</span> = json_encode(<span&gt;$arr</span><span&gt;);
                }
            }
        } </span><span&gt;else</span><span&gt; {
            </span><span&gt;//</span><span&gt;非微信浏览器</span>
            <span&gt;$wechat_pay</span> = <span&gt;new</span> Weixin_pay(<span&gt;$this</span>->wechat_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>['appsecret'],<span&gt;$this</span>->wechat_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>['mch_id'<span&gt;]);
            </span><span&gt;//</span><span&gt;h5支付不用传递openid 此处与微信jsapi支付不同</span>
            <span&gt;$openid</span> = ""<span&gt;;
            </span><span&gt;$total_fee</span> = 1<span&gt;;
            </span><span&gt;$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span> = '12345678945641231'<span&gt;;
            </span><span&gt;$body</span> = "充值金币h5支付测试"<span&gt;;
            </span><span&gt;$res</span> = <span&gt;$wechat_pay</span>->payh5(<span&gt;$openid</span>,<span&gt;$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span><span&gt;);
            </span><span&gt;$arr</span>['errcode'] = '0'<span&gt;;
            </span><span&gt;$arr</span>['errmsg'] = 'ok'<span&gt;;
            </span><span&gt;$arr</span>['url'] = <span&gt;$res</span>['mweb_url'];<span&gt;//</span><span&gt;微信唤起H5支付地址</span>
            <span&gt;$data</span> = json_encode(<span&gt;$arr</span><span&gt;);
        }
    } </span><span&gt;else</span><span&gt; {
        </span><span&gt;$data</span> = '{"errcode":"1001","errmsg":"TOKEN无效"}'<span&gt;;
    }
    </span><span&gt;echo</span> <span&gt;$data</span><span&gt;;
}

</span><span&gt;/*</span><span&gt;
在微信打开的时候唤起微信<a href="https://www.jb51.cc/tag/gongzhonghaozhifu/" target="_blank">公众号支付</a>。
</span><span&gt;*/</span>
<span&gt;public</span> <span&gt;function</span><span&gt; wx()
{
    </span><span&gt;$data</span> = input('get.data'<span&gt;);
    </span><span&gt;$this</span>->assign('data',<span&gt;$data</span><span&gt;);
    </span><span&gt;return</span><span&gt; view();
}

</span><span&gt;/*</span><span&gt;
<a href="https://www.jb51.cc/tag/huoqu/" target="_blank">获取</a>微信code
 </span><span&gt;*/</span>
<span&gt;public</span> <span&gt;function</span><span&gt; code()
{
    </span><span&gt;$code</span> = input('p<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>m.code'<span&gt;);
    </span><span&gt;$this</span>->redirect(cookie::get('url') . '?code=' . <span&gt;$code</span><span&gt;);
}

</span><span&gt;/*</span><span&gt;
微信回调
</span><span&gt;*/</span>
<span&gt;public</span> <span&gt;function</span><span&gt; wechat_notify()
{
    </span><span&gt;$ccc</span> = <span&gt;file_get_contents</span>('<a href="https://www.jb51.cc/tag/PHP/" target="_blank">PHP</a>://input'<span&gt;);
    </span><span&gt;$Weixin_pay</span> = <span&gt;new</span><span&gt; Weixin_pay();
    </span><span&gt;$data</span> = <span&gt;$Weixin_pay</span>->xmlToArray(<span&gt;$ccc</span><span&gt;);
    </span><span&gt;if</span> (<span&gt;$data</span>['result_code'] == 'SUCCESS' &amp;&amp; <span&gt;$data</span>['return_code'] == 'SUCCESS'<span&gt;) {
        </span><span&gt;//</span><span&gt;<a href="https://www.jb51.cc/tag/huoqu/" target="_blank">获取</a>订单号</span>
        <span&gt;$Ordersn</span> = <span&gt;$data</span>['out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no'];<span&gt;//</span><span&gt;订单号
        // 处理支付成功后的逻辑业务</span>

<span> }
}

</span><span&gt;/*</span><span&gt;
微信APP支付
 </span><span&gt;*/</span>
<span&gt;public</span> <span&gt;function</span><span&gt; app_wechat_pay()
{
    </span><span&gt;if</span> (input('post.token') ==<span&gt; TOKEN) {
        </span><span&gt;$wechat_pay</span> = <span&gt;new</span> Weixin_pay(<span&gt;$this</span>->wechat_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>['appsecret'],<span&gt;$this</span>->wechat_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>['mch_id'<span&gt;]);
        </span><span&gt;//</span><span&gt;h5支付不用传递openid 此处与微信jsapi支付不同</span>
        <span&gt;$openid</span> = ""<span&gt;;
        </span><span&gt;$total_fee</span> = 1<span&gt;;
        </span><span&gt;$body</span> = "充值金币APP支付测试"<span&gt;;
        </span><span&gt;$order_sn</span> = 123456789;<span&gt;//</span><span&gt;订单号</span>
        <span&gt;$res</span> = <span&gt;$wechat_pay</span>->app_pay(<span&gt;$body</span>,<span&gt;$order_sn</span>,<span&gt;$total_fee</span><span&gt;);
        </span><span&gt;if</span> (<span&gt;$res</span>['prepay_id']) {<span&gt;//</span><span&gt;判断返回参数中是否有prepay_id</span>
            <span&gt;$order</span> = <span&gt;$wechat_pay</span>->g<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>rder(<span&gt;$res</span>['prepay_id']);<span&gt;//</span><span&gt;执行二次签名返回参数</span>
            <span&gt;$arr</span>['errcode'] = '0'<span&gt;;
            </span><span&gt;$arr</span>['errmsg'] = 'ok'<span&gt;;
            </span><span&gt;$arr</span>['order'] = <span&gt;$order</span><span&gt;;
            </span><span&gt;$data</span> = json_encode(<span&gt;$arr</span><span&gt;);
        } </span><span&gt;else</span><span&gt; {
            </span><span&gt;$arr</span>['errcode'] = '1003'<span&gt;;
            </span><span&gt;$arr</span>['errmsg'] = <span&gt;$res</span>['err_code_des'<span&gt;];
            </span><span&gt;$data</span> = json_encode(<span&gt;$arr</span><span&gt;);
        }
    } </span><span&gt;else</span><span&gt; {
        </span><span&gt;$data</span> = '{"errcode":"1001","errmsg":"TOKEN无效"}'<span&gt;;
    }
    </span><span&gt;echo</span> <span&gt;$data</span><span&gt;;
}

</span><span&gt;/*</span><span&gt;
支付宝开始支付
</span><span&gt;*/</span>
<span&gt;public</span> <span&gt;function</span><span&gt; alipay()
{</span><span&gt;//</span><span&gt;发起支付宝支付</span>
    <span&gt;if</span> (input('post.token') ==<span&gt; TOKEN) {
        </span><span&gt;$link</span> = 'http://' . <span&gt;$_SERVER</span>['HTTP_HOST'] . '/#/cz'<span&gt;;
        cookie</span>::set('url',300<span&gt;);
        </span><span&gt;$res</span>['out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no'] = 123456798123<span&gt;;
        </span><span&gt;$res</span>['subject'] = '充值'<span&gt;;
        </span><span&gt;$res</span>['body'] = '测试'<span&gt;;
        </span><span&gt;$res</span>['money'] = 0.01<span&gt;;
        </span><span&gt;$Pay</span> = <span&gt;new</span> Alipay(<span&gt;$this</span>->alipay_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>['partner'],<span&gt;$this</span>->alipay_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>['md5_key'<span&gt;]);
        </span><span&gt;$result</span> = <span&gt;$Pay</span>-><span&gt;alipay([
            </span>'notify_url' => 'your notify_url','return_url' => 'your return_url','out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no' => <span&gt;$res</span>['out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no'],'subject' => <span&gt;$res</span>['subject'],'total_fee' => <span&gt;$res</span>['money'],'body' => <span&gt;$res</span>['body'],<span&gt;
        ]);
        </span><span&gt;$arr</span>['errcode'] = '0'<span&gt;;
        </span><span&gt;$arr</span>['errmsg'] = 'ok'<span&gt;;
        </span><span&gt;return</span> <span&gt;$result</span>['msg'<span&gt;];
    } </span><span&gt;else</span><span&gt; {
        </span><span&gt;$data</span> = '{"errcode":"1001","errmsg":"TOKEN无效"}'<span&gt;;
    }
    </span><span&gt;echo</span> <span&gt;$data</span><span&gt;;
}

</span><span&gt;/*</span><span&gt;
支付宝回调
</span><span&gt;*/</span>
<span&gt;public</span> <span&gt;function</span><span&gt; alipay_notify()
{</span><span&gt;//</span><span&gt;异步订单<a href="https://www.jb51.cc/tag/tongzhi/" target="_blank">通知</a></span>
    <span&gt;$wx</span> = sys_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a>_get('payment'<span&gt;);
    </span><span&gt;$Pay</span> = <span&gt;new</span> Alipay(<span&gt;$wx</span>['aliwappay']['partner'],<span&gt;$wx</span>['aliwappay']['md5_key'<span&gt;]);
    </span><span&gt;$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span> = input('out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no'<span&gt;);
    </span><span&gt;$<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_status</span> = input('<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_status'<span&gt;);
    </span><span&gt;if</span> (<span&gt;$<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_status</span> == '<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>E_SUCCESS'<span&gt;) {
        </span><span&gt;//</span><span&gt; 处理支付成功后的逻辑业务</span>

<span>
} <span>else<span> {
<span>//<span> 处理支付失败后的逻辑业务
<span> }
}
}

模型:Weixin.PHP

PHP

namespace app\phone\model;

<span>use<span> think\Db;
<span>use<span> think\Validate;
<span>use<span> think\Loader;
<span>use<span> think\Model;

<span>class Weixin <span>extends<span> model
{
<span>protected <span>$appScrect<span>;
<span>protected <span>$appId<span>;

</span><span&gt;public</span> <span&gt;function</span> __construct(<span&gt;$appScrect</span> = "",<span&gt;$appId</span> = ""<span&gt;)
{
    </span><span&gt;$this</span>->appScrect = <span&gt;$appScrect</span><span&gt;;
    </span><span&gt;$this</span>->appId = <span&gt;$appId</span><span&gt;;
}

</span><span&gt;/*</span><span&gt;
 * 因为本项目需求,前端是Vue<a href="https://www.jb51.cc/tag/houtai/" target="_blank">后台</a>是TP5两个项目不在<a href="https://www.jb51.cc/tag/yige/" target="_blank">一个</a>服务器所以我的url是return 回控制器通过接口返回给前端
 * 如果是正常html<a href="https://www.jb51.cc/tag/yemian/" target="_blank">页面</a>可以使用header("Location: $url"); 以下<a href="https://www.jb51.cc/tag/fangfa/" target="_blank">方法</a>都是
 * </span><span&gt;*/</span>
<span&gt;public</span> <span&gt;function</span> code_shouquan(<span&gt;$link</span><span&gt;)
{
    </span><span&gt;$redirect_uri</span> = <span&gt;urlencode</span>('网址/pay/code');<span&gt;//</span><span&gt;微信<a href="https://www.jb51.cc/tag/huoqu/" target="_blank">获取</a>网页授权地址
    // 1、引导<a href="https://www.jb51.cc/tag/yonghu/" target="_blank">用户</a>进入授权<a href="https://www.jb51.cc/tag/yemian/" target="_blank">页面</a>同意授权,<a href="https://www.jb51.cc/tag/huoqu/" target="_blank">获取</a>code
    // 2、通过code换取网页授权access_token
    // 3、如果需要,开发者可以刷新网页授权access_token,避免过期
    // 4、通过网页授权access_token和openid<a href="https://www.jb51.cc/tag/huoqu/" target="_blank">获取</a><a href="https://www.jb51.cc/tag/yonghu/" target="_blank">用户</a>基本信息(<a href="https://www.jb51.cc/tag/zhichi/" target="_blank">支持</a>UnionID机制)</span>
    <span&gt;$url</span> = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" . <span&gt;$this</span>->appId . "&amp;redirect_uri=" . <span&gt;$redirect_uri</span> . "&amp;response_type=code&amp;s<a href="https://www.jb51.cc/tag/cop/" target="_blank">cop</a>e=snsapi_userinfo&amp;state=1234#wechat_redirect"<span&gt;;
    </span><span&gt;return</span> <span&gt;$url</span><span&gt;;
}


</span><span&gt;public</span> <span&gt;function</span> get_access_token(<span&gt;$code</span><span&gt;)
{

    </span><span&gt;//</span><span&gt;检测缓存中是否有access_token(2小时),如果存在直接返回,不存在则检测缓存中的refresh_token(30天),// refresh_token如果存在<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank">调用</a>刷新缓存;如果不存在重新发起授权code授权</span>
    <span&gt;$url</span> = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . <span&gt;$this</span>->appId . "&amp;secret=" . <span&gt;$this</span>->appScrect . "&amp;code=" . <span&gt;$code</span> . "&amp;grant_type=authorization_code"<span&gt;;
    </span><span&gt;$res</span> = <span&gt;$this</span>->sendRequest(<span&gt;$url</span><span&gt;);
    </span><span&gt;return</span> <span&gt;$res</span><span&gt;;
}

</span><span&gt;public</span> <span&gt;function</span> get_refresh_token(<span&gt;$refresh_token</span><span&gt;)
{

    </span><span&gt;$url</span> = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" . <span&gt;$this</span>->appId . "&amp;grant_type=refresh_token&amp;refresh_token=" . <span&gt;$refresh_token</span><span&gt;;
    </span><span&gt;$res</span> = <span&gt;$this</span>->sendRequest(<span&gt;$url</span><span&gt;);
    </span><span&gt;return</span> <span&gt;$res</span><span&gt;;
}

</span><span&gt;public</span> <span&gt;function</span> get_openid_userinfo(<span&gt;$access_token</span>,<span&gt;$openid</span><span&gt;)
{
    </span><span&gt;$url</span> = "https://api.weixin.qq.com/sns/userinfo?access_token=" . <span&gt;$access_token</span> . "&amp;openid=" . <span&gt;$openid</span> . "&amp;lang=zh_CN"<span&gt;;
    </span><span&gt;$res</span> = <span&gt;$this</span>->sendRequest(<span&gt;$url</span><span&gt;);
    </span><span&gt;return</span> <span&gt;$res</span><span&gt;;
}

</span><span&gt;/*</span><span&gt;

发送请求
<span>*/
<span>public <span>function sendRequest(<span>$url<span>)
{
<span>$ch =<span> curl_init();
curl_setopt(<span>$ch,CURLOPT_URL,<span>$url<span>);
curl_setopt(<span>$ch,CURLOPT_SSL_VERIFYPEER,<span>FALSE<span>);
curl_setopt(<span>$ch,CURLOPT_SSL_VERIFYHOST,CURLOPT_RETURNTRANSFER,1<span>);
<span>$output = curl_exec(<span>$ch<span>);
curl_close(<span>$ch<span>);
<span>return json_decode(<span>$output,<span>true<span>);
}
}

Weixin.PHP

PHP namespace app\phone\model; <span>class Weixin_pay <span>extends<span> model
{
<span>protected <span>$appScrect;<span>//<span>微信公众平台的appscrect
<span>protected <span>$appId;<span>//<span>微信公众平台appid
<span>protected <span>$key;<span>//<span>微信商户平台配置的秘钥
<span>protected <span>$mch_id;<span>//<span>微信商户号
<span>protected <span>$values = <span>array<span>();

</span><span&gt;public</span> <span&gt;function</span> __construct(<span&gt;$appScrect</span>="",<span&gt;$appId</span>="",<span&gt;$key</span>="",<span&gt;$mch_id</span> =''<span&gt;){
    </span><span&gt;$this</span>->appScrect=<span&gt;$appScrect</span><span&gt;;
    </span><span&gt;$this</span>->appId=<span&gt;$appId</span><span&gt;;
    </span><span&gt;$this</span>-><span&gt;key</span>=<span&gt;$key</span><span&gt;;
    </span><span&gt;$this</span>->mch_id=<span&gt;$mch_id</span><span&gt;;

}
</span><span&gt;public</span> <span&gt;function</span> app_pay(<span&gt;$body</span>,<span&gt;$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span>,<span&gt;$total_fee</span><span&gt;){
    </span><span&gt;$url</span> = "https://api.mch.weixin.qq.com/pay/unifiedorder"<span&gt;;
    </span><span&gt;$notify_url</span> = '';<span&gt;//</span><span&gt;可以<a href="https://www.jb51.cc/tag/zaizhe/" target="_blank">在这</a>填写回调地址也可以<a href="https://www.jb51.cc/tag/zengjia/" target="_blank">增加</a><a href="https://www.jb51.cc/tag/yige/" target="_blank">一个</a>参数传过来。也可以直接在构造里面加<a href="https://www.jb51.cc/tag/yige/" target="_blank">一个</a>notify_<a href="https://www.jb51.cc/tag/URLdizhi/" target="_blank">URL地址</a></span>
    <span&gt;$onoce_str</span> = <span&gt;$this</span>-><span&gt;createNonce<a href="https://www.jb51.cc/tag/str/" target="_blank">str()</a>;
    </span><span&gt;$data</span>["appid"] = <span&gt;$this</span>-><span&gt;appId;
    </span><span&gt;$data</span>["body"] = <span&gt;$body</span><span&gt;;
    </span><span&gt;$data</span>["mch_id"] = <span&gt;$this</span>-><span&gt;mch_id;
    </span><span&gt;$data</span>["nonce_str"] = <span&gt;$onoce_str</span><span&gt;;
    </span><span&gt;$data</span>["notify_url"] = <span&gt;$notify_url</span><span&gt;;
    </span><span&gt;$data</span>["out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no"] = <span&gt;$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span><span&gt;;
    </span><span&gt;$data</span>["spbill_create_ip"] = <span&gt;$this</span>-><span&gt;get_client_ip();
    </span><span&gt;$data</span>["total_fee"] = <span&gt;$total_fee</span><span&gt;;
    </span><span&gt;$data</span>["<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_type"] = "APP"<span&gt;;
    </span><span&gt;$sign</span> = <span&gt;$this</span>->getSign(<span&gt;$data</span><span&gt;);
    </span><span&gt;$data</span>["sign"] = <span&gt;$sign</span><span&gt;;
    </span><span&gt;$xml</span> = <span&gt;$this</span>->arrayToXml(<span&gt;$data</span><span&gt;);
    </span><span&gt;$response</span> = <span&gt;$this</span>->postXmlCurl(<span&gt;$xml</span>,<span&gt;$url</span><span&gt;);
    </span><span&gt;//</span><span&gt; return $xml;
    //将微信返回的结果xml转成数组</span>
    <span&gt;$response</span> = <span&gt;$this</span>->xmlToArray(<span&gt;$response</span><span&gt;);
    </span><span&gt;//</span><span&gt;返回数据</span>
    <span&gt;return</span> <span&gt;$response</span><span&gt;;
}
</span><span&gt;//</span><span&gt;执行第二次签名,才能返回给客户端使用</span>
<span&gt;public</span> <span&gt;function</span> g<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>rder(<span&gt;$prepayId</span><span&gt;){
    </span><span&gt;$data</span>["appid"] = <span&gt;$this</span>-><span&gt;appId;
    </span><span&gt;$data</span>["noncestr"] = <span&gt;$this</span>-><span&gt;createNonce<a href="https://www.jb51.cc/tag/str/" target="_blank">str()</a>;;
    </span><span&gt;$data</span>["package"] = "Sign=WXPay"<span&gt;;
    </span><span&gt;$data</span>["partnerid"] = <span&gt;$this</span>-><span&gt;mch_id;
    </span><span&gt;$data</span>["prepayid"] = <span&gt;$prepayId</span><span&gt;;
    </span><span&gt;$data</span>["timestamp"] = <span&gt;time</span><span&gt;();
    </span><span&gt;$s</span> = <span&gt;$this</span>->getSign(<span&gt;$data</span>,<span&gt;false</span><span&gt;);
    </span><span&gt;$data</span>["sign"] = <span&gt;$s</span><span&gt;;
    </span><span&gt;return</span> <span&gt;$data</span><span&gt;;
}
</span><span&gt;/*</span><span&gt;
<a href="https://www.jb51.cc/tag/gongzhonghaozhifu/" target="_blank">公众号支付</a>
 </span><span&gt;*/</span>
<span&gt;public</span> <span&gt;function</span> pay(<span&gt;$openid</span>,<span&gt;$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span><span&gt;){
    </span><span&gt;$url</span> = "https://api.mch.weixin.qq.com/pay/unifiedorder"<span&gt;;
    </span><span&gt;$notify_url</span> = ''<span&gt;;
    </span><span&gt;$onoce_str</span> = <span&gt;$this</span>-><span&gt;createNonce<a href="https://www.jb51.cc/tag/str/" target="_blank">str()</a>;
    </span><span&gt;$data</span>["appid"] = <span&gt;$this</span>-><span&gt;appId;
    </span><span&gt;$data</span>["body"] = <span&gt;$body</span><span&gt;;
    </span><span&gt;$data</span>["mch_id"] = <span&gt;$this</span>-><span&gt;mch_id;
    </span><span&gt;$data</span>["nonce_str"] = <span&gt;$onoce_str</span><span&gt;;
    </span><span&gt;$data</span>["notify_url"] = <span&gt;$notify_url</span><span&gt;;
    </span><span&gt;$data</span>["out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no"] = <span&gt;$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span><span&gt;;
    </span><span&gt;$data</span>["spbill_create_ip"] = <span&gt;$this</span>-><span&gt;get_client_ip();
    </span><span&gt;$data</span>["total_fee"] = <span&gt;$total_fee</span><span&gt;;
    </span><span&gt;$data</span>["<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_type"] = "JSAPI"<span&gt;;
    </span><span&gt;$data</span>["openid"] = <span&gt;$openid</span><span&gt;;
    </span><span&gt;$sign</span> = <span&gt;$this</span>->getSign(<span&gt;$data</span><span&gt;);
    </span><span&gt;$data</span>["sign"] = <span&gt;$sign</span><span&gt;;
    </span><span&gt;$xml</span> = <span&gt;$this</span>->arrayToXml(<span&gt;$data</span><span&gt;);
    </span><span&gt;$response</span> = <span&gt;$this</span>->postXmlCurl(<span&gt;$xml</span>,<span&gt;$url</span><span&gt;);
    </span><span&gt;//</span><span&gt;将微信返回的结果xml转成数组</span>
    <span&gt;$response</span> = <span&gt;$this</span>->xmlToArray(<span&gt;$response</span><span&gt;);
    </span><span&gt;$jsapi</span>=<span&gt;array</span><span&gt;();
    </span><span&gt;$timeStamp</span> = <span&gt;time</span><span&gt;();
    </span><span&gt;$jsapi</span>['appId']=(<span&gt;$response</span>["appid"<span&gt;]);    
    </span><span&gt;$jsapi</span>['timeStamp']=("<span&gt;$timeStamp</span>"<span&gt;);
    </span><span&gt;$jsapi</span>['nonceStr']=(<span&gt;$this</span>-><span&gt;createNonce<a href="https://www.jb51.cc/tag/str/" target="_blank">str()</a>);
    </span><span&gt;$jsapi</span>['package']=("prepay_id=" . <span&gt;$response</span>['prepay_id'<span&gt;]);
    </span><span&gt;$jsapi</span>['signType']=("MD5"<span&gt;);
    </span><span&gt;$jsapi</span>['paySign']=(<span&gt;$this</span>->getSign(<span&gt;$jsapi</span><span&gt;));
    </span><span&gt;$p<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>meters</span> = json_encode(<span&gt;$jsapi</span><span&gt;);
    </span><span&gt;//</span><span&gt; halt($jsapi);
    //请求数据,统一下单  </span>
    <span&gt;return</span> <span&gt;$p<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>meters</span><span&gt;; 
}

</span><span&gt;public</span> <span&gt;function</span> payh5(<span&gt;$openid</span>,<span&gt;$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span><span&gt;){
    </span><span&gt;$url</span> = "https://api.mch.weixin.qq.com/pay/unifiedorder"<span&gt;;
    </span><span&gt;$notify_url</span> = ''<span&gt;;
    </span><span&gt;$onoce_str</span> = <span&gt;$this</span>-><span&gt;createNonce<a href="https://www.jb51.cc/tag/str/" target="_blank">str()</a>;
    </span><span&gt;$data</span>["appid"] = <span&gt;$this</span>-><span&gt;appId;
    </span><span&gt;$data</span>["body"] = <span&gt;$body</span><span&gt;;
    </span><span&gt;$data</span>["mch_id"] = <span&gt;$this</span>-><span&gt;mch_id;
    </span><span&gt;$data</span>["nonce_str"] = <span&gt;$onoce_str</span><span&gt;;
    </span><span&gt;$data</span>["notify_url"] = <span&gt;$notify_url</span><span&gt;;
    </span><span&gt;$data</span>["out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no"] = <span&gt;$out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no</span><span&gt;;
    </span><span&gt;$data</span>["spbill_create_ip"] = <span&gt;$this</span>-><span&gt;get_client_ip();
    </span><span&gt;$data</span>["total_fee"] = <span&gt;$total_fee</span><span&gt;;
    </span><span&gt;$data</span>["<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_type"] = "MWEB"<span&gt;;
    </span><span&gt;$data</span>["scene_info"] = "{'h5_info': {'type':'Wap','wap_url':  <span&gt;$notify_url</span>,'wap_name': '测试充值'}}"<span&gt;;
    </span><span&gt;$sign</span> = <span&gt;$this</span>->getSign(<span&gt;$data</span><span&gt;);
    </span><span&gt;$data</span>["sign"] = <span&gt;$sign</span><span&gt;;
    </span><span&gt;$xml</span> = <span&gt;$this</span>->arrayToXml(<span&gt;$data</span><span&gt;);
    </span><span&gt;//</span><span&gt; return $data;</span>
    <span&gt;$response</span> = <span&gt;$this</span>->postXmlCurl(<span&gt;$xml</span>,<span&gt;$url</span><span&gt;);
    </span><span&gt;//</span><span&gt;将微信返回的结果xml转成数组</span>
    <span&gt;$response</span> = <span&gt;$this</span>->xmlToArray(<span&gt;$response</span><span&gt;);
    </span><span&gt;//</span><span&gt;请求数据,统一下单  </span>
    <span&gt;return</span> <span&gt;$response</span><span&gt;; 
}

</span><span&gt;public</span> <span&gt;static</span> <span&gt;function</span> getNonceStr(<span&gt;$length</span> = 32<span&gt;)
{
    </span><span&gt;$chars</span> = "abcdefghijklm<a href="https://www.jb51.cc/tag/nop/" target="_blank">nop</a>qrstuvwxyz0123456789"<span&gt;;
    </span><span&gt;$str</span> =""<span&gt;;
    </span><span&gt;for</span> ( <span&gt;$i</span> = 0; <span&gt;$i</span> < <span&gt;$length</span>; <span&gt;$i</span>++<span&gt; )  {
        </span><span&gt;$str</span> .= <span&gt;substr</span>(<span&gt;$chars</span>,<span&gt;mt_rand</span>(0,<span&gt;strlen</span>(<span&gt;$chars</span>)-1),1<span&gt;);
    }
    </span><span&gt;return</span> <span&gt;$str</span><span&gt;;
}

</span><span&gt;//</span><span&gt;   /*<a href="https://www.jb51.cc/tag/shengcheng/" target="_blank">生成</a>签名*/</span>
<span&gt;public</span> <span&gt;function</span> getSign(<span&gt;$Obj</span><span&gt;){
    </span><span&gt;foreach</span> (<span&gt;$Obj</span> <span&gt;as</span> <span&gt;$k</span> => <span&gt;$v</span><span&gt;){
        </span><span&gt;$P<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>meters</span>[<span&gt;$k</span>] = <span&gt;$v</span><span&gt;;
    }
    </span><span&gt;//</span><span&gt;签名步骤一:按字典序排序参数</span>
    <span&gt;ksort</span>(<span&gt;$P<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>meters</span><span&gt;);
    </span><span&gt;$String</span> = <span&gt;$this</span>->formatBizQueryP<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>Map(<span&gt;$P<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>meters</span>,<span&gt;false</span><span&gt;);
    </span><span&gt;//</span><span&gt;echo '【string1】'.$String.'</br>';
    //签名步骤二:在string后加入KEY</span>
    <span&gt;$String</span> = <span&gt;$String</span>."&amp;key=".<span&gt;$this</span>-><span&gt;key</span><span&gt;;
    </span><span&gt;//</span><span&gt;echo "【string2】".$String."</br>";
    //签名步骤三:MD5加密</span>
    <span&gt;$String</span> = <span&gt;md5</span>(<span&gt;$String</span><span&gt;);
    </span><span&gt;//</span><span&gt;echo "【string3】 ".$String."</br>";
    //签名步骤四:所有字符转为大写</span>
    <span&gt;$result_</span> = <span&gt;str<a href="https://www.jb51.cc/tag/toupper/" target="_blank">toupper</a></span>(<span&gt;$String</span><span&gt;);
    </span><span&gt;//</span><span&gt;echo "【result】 ".$result_."</br>";</span>
    <span&gt;return</span> <span&gt;$result_</span><span&gt;;
}


</span><span&gt;/*</span><span&gt;*
*  作用:产生<a href="https://www.jb51.cc/tag/suiji/" target="_blank">随机</a>字符串,不长于32位
</span><span&gt;*/</span>
<span&gt;public</span> <span&gt;function</span> createNoncestr( <span&gt;$length</span> = 32<span&gt; ){
    </span><span&gt;$chars</span> = "abcdefghijklm<a href="https://www.jb51.cc/tag/nop/" target="_blank">nop</a>qrstuvwxyz0123456789"<span&gt;; 
    </span><span&gt;$str</span> =""<span&gt;;
    </span><span&gt;for</span> ( <span&gt;$i</span> = 0; <span&gt;$i</span> < <span&gt;$length</span>; <span&gt;$i</span>++<span&gt; )  { 
        </span><span&gt;$str</span>.= <span&gt;substr</span>(<span&gt;$chars</span>,1<span&gt;); 
    } 
    </span><span&gt;return</span> <span&gt;$str</span><span&gt;;
}


</span><span&gt;//</span><span&gt;数组转xml</span>
<span&gt;public</span> <span&gt;function</span> arrayToXml(<span&gt;$arr</span><span&gt;){
    </span><span&gt;$xml</span> = "<xml>"<span&gt;;
    </span><span&gt;foreach</span> (<span&gt;$arr</span> <span&gt;as</span> <span&gt;$key</span>=><span&gt;$val</span><span&gt;){
        </span><span&gt;if</span> (<span&gt;is_numeric</span>(<span&gt;$val</span><span&gt;)){
            </span><span&gt;$xml</span>.="<".<span&gt;$key</span>."&gt;".<span&gt;$val</span>."</".<span&gt;$key</span>."&gt;"<span&gt;;
        }</span><span&gt;else</span><span&gt;{
            </span><span&gt;$xml</span>.="<".<span&gt;$key</span>."&gt;<![CDATA[".<span&gt;$val</span>."]]></".<span&gt;$key</span>."&gt;"<span&gt;; 
        }
    }
    </span><span&gt;$xml</span>.="</xml>"<span&gt;;
    </span><span&gt;return</span> <span&gt;$xml</span><span&gt;;
}


</span><span&gt;/*</span><span&gt;*
*  作用:将xml转为array
</span><span&gt;*/</span>
<span&gt;public</span> <span&gt;function</span> xmlToArray(<span&gt;$xml</span><span&gt;){  
    </span><span&gt;//</span><span&gt;将XML转为array       </span>
    <span&gt;$array_data</span> = json_decode(json_encode(<span&gt;simplexml_load_string</span>(<span&gt;$xml</span>,'SimpleXMLElement',LIBXML_NOCDATA)),<span&gt;true</span><span&gt;);
    </span><span&gt;return</span> <span&gt;$array_data</span><span&gt;;
}


</span><span&gt;/*</span><span&gt;*
*  作用:以post方式提交xml到对应的接口url
</span><span&gt;*/</span>
<span&gt;public</span> <span&gt;function</span> postXmlCurl(<span&gt;$xml</span>,<span&gt;$url</span>,<span&gt;$second</span>=30<span&gt;){  
    </span><span&gt;//</span><span&gt;初始化curl       </span>
    <span&gt;$ch</span> =<span&gt; curl_init();
    </span><span&gt;//</span><span&gt;设置超时</span>
    curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(<span&gt;$ch</span>,CURLOPT_TIMEOUT,<span&gt;$second</span><span&gt;);
    </span><span&gt;//</span><span&gt;这里设置代理,如果有的话
    //curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt($ch,CURLOPT_PROXY,'8.8.8.8');
    //curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt($ch,CURLOPT_PROXYPORT,8080);</span>
    curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(<span&gt;$ch</span>,<span&gt;FALSE</span><span&gt;);
    </span><span&gt;//</span><span&gt;设置header</span>
    curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(<span&gt;$ch</span>,CURLOPT_HEADER,<span&gt;FALSE</span><span&gt;);
    </span><span&gt;//</span><span&gt;要求结果为字符串且<a href="https://www.jb51.cc/tag/shuchu/" target="_blank">输出</a>到屏幕上</span>
    curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(<span&gt;$ch</span>,<span&gt;TRUE</span><span&gt;);
    </span><span&gt;//</span><span&gt;post提交方式</span>
    curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(<span&gt;$ch</span>,CURLOPT_POST,<span&gt;TRUE</span><span&gt;);
    curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(</span><span&gt;$ch</span>,CURLOPT_POSTFIELDS,<span&gt;$xml</span><span&gt;);
    </span><span&gt;//</span><span&gt;运行curl</span>
    <span&gt;$data</span> = curl_exec(<span&gt;$ch</span><span&gt;);
    </span><span&gt;//</span><span&gt;返回结果</span>

    <span&gt;if</span>(<span&gt;$data</span><span&gt;){
        curl_close(</span><span&gt;$ch</span><span&gt;);
        </span><span&gt;return</span> <span&gt;$data</span><span&gt;;
    }</span><span&gt;else</span><span&gt;{
        </span><span&gt;$error</span> = curl_errno(<span&gt;$ch</span><span&gt;);
        </span><span&gt;echo</span> "curl出错,<a href="https://www.jb51.cc/tag/cuowu/" target="_blank">错误</a>码:<span&gt;$error</span>"."<br>"<span&gt;;
        curl_close(</span><span&gt;$ch</span><span&gt;);
        </span><span&gt;return</span> <span&gt;false</span><span&gt;;
    }
}


</span><span&gt;/*</span><span&gt;
<a href="https://www.jb51.cc/tag/huoqu/" target="_blank">获取</a>当前服务器的IP
</span><span&gt;*/</span>
<span&gt;public</span> <span&gt;function</span><span&gt; get_client_ip(){
    </span><span&gt;if</span>(<span&gt;getenv</span>('HTTP_CLIENT_IP') &amp;&amp; <span&gt;strcasecmp</span>(<span&gt;getenv</span>('HTTP_CLIENT_IP'),'unk<a href="https://www.jb51.cc/tag/Now/" target="_blank">Now</a>n'<span&gt;)) {

        </span><span&gt;$ip</span> = <span&gt;getenv</span>('HTTP_CLIENT_IP'<span&gt;);

    } </span><span&gt;elseif</span>(<span&gt;getenv</span>('HTTP_X_FORWARDED_FOR') &amp;&amp; <span&gt;strcasecmp</span>(<span&gt;getenv</span>('HTTP_X_FORWARDED_FOR'),'unk<a href="https://www.jb51.cc/tag/Now/" target="_blank">Now</a>n'<span&gt;)) {

        </span><span&gt;$ip</span> = <span&gt;getenv</span>('HTTP_X_FORWARDED_FOR'<span&gt;);

    } </span><span&gt;elseif</span>(<span&gt;getenv</span>('REMOTE_ADDR') &amp;&amp; <span&gt;strcasecmp</span>(<span&gt;getenv</span>('REMOTE_ADDR'),'unk<a href="https://www.jb51.cc/tag/Now/" target="_blank">Now</a>n'<span&gt;)) {

        </span><span&gt;$ip</span> = <span&gt;getenv</span>('REMOTE_ADDR'<span&gt;);

    } </span><span&gt;elseif</span>(<span&gt;isset</span>(<span&gt;$_SERVER</span>['REMOTE_ADDR']) &amp;&amp; <span&gt;$_SERVER</span>['REMOTE_ADDR'] &amp;&amp; <span&gt;strcasecmp</span>(<span&gt;$_SERVER</span>['REMOTE_ADDR'],'unk<a href="https://www.jb51.cc/tag/Now/" target="_blank">Now</a>n'<span&gt;)) {

        </span><span&gt;$ip</span> = <span&gt;$_SERVER</span>['REMOTE_ADDR'<span&gt;];

    }

    </span><span&gt;return</span> <span&gt;preg_match</span> ( '/[\d\.]{7,15}/',<span&gt;$ip</span>,<span&gt;$matches</span> ) ? <span&gt;$matches</span> [0] : ''<span&gt;;
}


</span><span&gt;/*</span><span&gt;*
*  作用:格式化参数,签名过程需要使用
</span><span&gt;*/</span>
<span&gt;public</span> <span&gt;function</span> formatBizQueryP<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>Map(<span&gt;$p<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>Map</span>,<span&gt;$urlencode</span><span&gt;){
    </span><span&gt;$buff</span> = ""<span&gt;;
    </span><span&gt;ksort</span>(<span&gt;$p<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>Map</span><span&gt;);
    </span><span&gt;foreach</span> (<span&gt;$p<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>Map</span> <span&gt;as</span> <span&gt;$k</span> => <span&gt;$v</span><span&gt;){
        </span><span&gt;if</span>(<span&gt;$urlencode</span><span&gt;){
            </span><span&gt;$v</span> = <span&gt;urlencode</span>(<span&gt;$v</span><span&gt;);
        }
        </span><span&gt;$buff</span> .= <span&gt;$k</span> . "=" . <span&gt;$v</span> . "&amp;"<span&gt;;
    }
    </span><span&gt;$reqPar</span><span&gt;;
    </span><span&gt;if</span> (<span&gt;strlen</span>(<span&gt;$buff</span>) > 0<span&gt;){
        </span><span&gt;$reqPar</span> = <span&gt;substr</span>(<span&gt;$buff</span>,<span&gt;strlen</span>(<span&gt;$buff</span>)-1<span&gt;);
    }
    </span><span&gt;return</span> <span&gt;$reqPar</span><span&gt;;
}

    </span><span&gt;public</span> <span&gt;function</span> MakeSign(<span&gt;$unifiedorder</span><span&gt;)
{
    </span><span&gt;$this</span>->values=<span&gt;$unifiedorder</span><span&gt;;
    </span><span&gt;//</span>@H_<a href="https://www.jb51.cc/tag/301/" target="_blank">301</a>_1224@values);</span>
    <span&gt;$string</span> = <span&gt;$this</span>-><span&gt;ToUrlP<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>ms();
    </span><span&gt;//</span><span&gt;halt($string);
    //签名步骤二:在string后加入KEY</span>
    <span&gt;$string</span> = <span&gt;$string</span> . "&amp;key=".<span&gt;$this</span>-><span&gt;key</span><span&gt;;
    </span><span&gt;//</span><span&gt;签名步骤三:MD5加密</span>
    <span&gt;$string</span> = <span&gt;md5</span>(<span&gt;$string</span><span&gt;);
    </span><span&gt;//</span><span&gt;签名步骤四:所有字符转为大写</span>
    <span&gt;$result</span> = <span&gt;str<a href="https://www.jb51.cc/tag/toupper/" target="_blank">toupper</a></span>(<span&gt;$string</span><span&gt;);
    </span><span&gt;return</span> <span&gt;$result</span><span&gt;;
}

</span><span&gt;public</span> <span&gt;function</span><span&gt; ToUrlP<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>ms()
{
    </span><span&gt;$buff</span> = ""<span&gt;;
    </span><span&gt;foreach</span> (<span&gt;$this</span>->values <span&gt;as</span> <span&gt;$k</span> => <span&gt;$v</span><span&gt;)
    {
        </span><span&gt;if</span>(<span&gt;$k</span> != "sign" &amp;&amp; <span&gt;$v</span> != "" &amp;&amp; !<span&gt;is_array</span>(<span&gt;$v</span><span&gt;)){
            </span><span&gt;$buff</span> .= <span&gt;$k</span> . "=" . <span&gt;$v</span> . "&amp;"<span&gt;;
        }
    }
    </span><span&gt;$buff</span> = <span&gt;trim</span>(<span&gt;$buff</span>,"&amp;"<span&gt;);
    </span><span&gt;return</span> <span&gt;$buff</span><span&gt;;
}


      </span><span&gt;function</span> array2xml(<span&gt;$array</span><span&gt;)
{
    </span><span&gt;$xml</span>='<xml>'<span&gt;;
    </span><span&gt;foreach</span>(<span&gt;$array</span> <span&gt;as</span> <span&gt;$key</span>=><span&gt;$val</span><span&gt;){
        </span><span&gt;if</span>(<span&gt;is_numeric</span>(<span&gt;$key</span><span&gt;)){
            </span><span&gt;$key</span>="item id=\"<span&gt;$key</span>\""<span&gt;;
        }</span><span&gt;else</span><span&gt;{
            </span><span&gt;//</span><span&gt;去掉空格,只取空格之前<a href="https://www.jb51.cc/tag/wenzi/" target="_blank">文字</a>为key</span>
            <span&gt;list</span>(<span&gt;$key</span>,)=<span&gt;explode</span>(' ',<span&gt;$key</span><span&gt;);
        } 
        </span><span&gt;$xml</span>.="<<span&gt;$key</span>>"<span&gt;;
        </span><span&gt;$xml</span>.=<span&gt;is_array</span>(<span&gt;$val</span>)?<span&gt;$this</span>->_array2xml(<span&gt;$val</span>):<span&gt;$val</span><span&gt;;
        </span><span&gt;//</span><span&gt;去掉空格,只取空格之前<a href="https://www.jb51.cc/tag/wenzi/" target="_blank">文字</a>为key</span>
        <span&gt;list</span>(<span&gt;$key</span>,<span&gt;$key</span><span&gt;);
        </span><span&gt;$xml</span>.="</<span&gt;$key</span>>"<span&gt;;

    }
        </span><span&gt;$xml</span>.="</xml>"<span&gt;;

    </span><span&gt;return</span> <span&gt;$xml</span><span&gt;;
}

   </span><span&gt;function</span> xml2array(<span&gt;$xml</span><span&gt;)
{    
    </span><span&gt;//</span><span&gt;<a href="https://www.jb51.cc/tag/jinzhi/" target="_blank">禁止</a>引用外部xml实体</span>
    libxml_<a href="https://www.jb51.cc/tag/dis/" target="_blank">dis</a>able_entity_loader(<span&gt;true</span><span&gt;);
    </span><span&gt;$values</span> = json_decode(json_encode(<span&gt;simplexml_load_string</span>(<span&gt;$xml</span>,<span&gt;true</span><span&gt;);  
    </span><span&gt;return</span> <span&gt;$values</span><span&gt;;
}


</span><span&gt;public</span>  <span&gt;function</span> request_post(<span&gt;$url</span> = '',<span&gt;$p<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>m</span> = ''<span&gt;)
{
    </span><span&gt;if</span> (<span&gt;empty</span>(<span&gt;$url</span>) || <span&gt;empty</span>(<span&gt;$p<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>m</span><span&gt;)) {
        </span><span&gt;return</span> <span&gt;false</span><span&gt;;
    }
    </span><span&gt;$postUrl</span> = <span&gt;$url</span><span&gt;;
    </span><span&gt;$curlPost</span> = <span&gt;$p<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>m</span><span&gt;;
    </span><span&gt;$ch</span> = curl_init(); <span&gt;//</span><span&gt;初始化curl</span>
    curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(<span&gt;$ch</span>,<span&gt;$postUrl</span>); <span&gt;//</span><span&gt;抓取指定网页</span>
    curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(<span&gt;$ch</span>,0); <span&gt;//</span><span&gt;设置header</span>
    curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(<span&gt;$ch</span>,1); <span&gt;//</span><span&gt;要求结果为字符串且<a href="https://www.jb51.cc/tag/shuchu/" target="_blank">输出</a>到屏幕上</span>
    curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(<span&gt;$ch</span>,1); <span&gt;//</span><span&gt;post提交方式</span>
    curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(<span&gt;$ch</span>,<span&gt;$curlPost</span><span&gt;);
    </span><span&gt;$data</span> = curl_exec(<span&gt;$ch</span>); <span&gt;//</span><span&gt;运行curl</span>
    curl_close(<span&gt;$ch</span><span&gt;);
    </span><span&gt;return</span> <span&gt;$data</span><span&gt;;
}

</span><span&gt;function</span> curl_post_ssl(<span&gt;$url</span>,<span&gt;$vars</span>,<span&gt;$second</span>=30,<span&gt;$aHeader</span>=<span&gt;array</span><span&gt;())
{
    </span><span&gt;$ch</span> =<span&gt; curl_init();
    </span><span&gt;//</span><span&gt;curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt($ch,CURLOPT_VERBOSE,'1');</span>
    curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(<span&gt;$ch</span>,<span&gt;$second</span><span&gt;);
    curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(</span><span&gt;$ch</span>,1<span&gt;);
    curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(</span><span&gt;$ch</span>,<span&gt;false</span><span&gt;);
    curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(</span><span&gt;$ch</span>,CURLOPT_SSLCERTTYPE,'PEM'<span&gt;);
    curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(</span><span&gt;$ch</span>,CURLOPT_SSLCERT,'/data/cert/<a href="https://www.jb51.cc/tag/PHP/" target="_blank">PHP</a>.pem'<span&gt;);
    curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(</span><span&gt;$ch</span>,CURLOPT_SSLCERTPASSWD,'1234'<span&gt;);
    curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(</span><span&gt;$ch</span>,CURLOPT_SSLKEYTYPE,CURLOPT_SSLKEY,'/data/cert/<a href="https://www.jb51.cc/tag/PHP/" target="_blank">PHP</a>_private.pem'<span&gt;);
    </span><span&gt;if</span>( <span&gt;count</span>(<span&gt;$aHeader</span>) >= 1<span&gt; ){
            curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(</span><span&gt;$ch</span>,CURLOPT_HTTPHEADER,<span&gt;$aHeader</span><span&gt;);
    }
    curl_s<a href="https://www.jb51.cc/tag/eto/" target="_blank">eto</a>pt(</span><span&gt;$ch</span>,<span&gt;$vars</span><span&gt;);
    </span><span&gt;$data</span> = curl_exec(<span&gt;$ch</span><span&gt;);
    curl_close(</span><span&gt;$ch</span><span&gt;);
    </span><span&gt;if</span>(<span&gt;$data</span><span&gt;){
        </span><span&gt;return</span> <span&gt;$data</span><span&gt;;
    }</span><span&gt;else</span><span&gt;{
        </span><span&gt;return</span> <span&gt;false</span><span&gt;;
    }
}

}

Alipay.PHP

PHP namespace app\phone\model;

<span>use<span> think\Validate;
<span>use think\<span>Log<span>;
<span>use<span> think\Model;
<span>use<span> lib\<span>AlipaySubmit;

<span>class Alipay <span>extends<span> Model
{
<span>protected <span>$partner<span>;
<span>protected <span>$md5_key<span>;

</span><span&gt;public</span> <span&gt;function</span> __construct(<span&gt;$partner</span> = "",<span&gt;$md5_key</span> = ""<span&gt;)
{
    </span><span&gt;$this</span>->partner = <span&gt;$partner</span><span&gt;;
    </span><span&gt;$this</span>->md5_key = <span&gt;$md5_key</span><span&gt;;
}

</span><span&gt;public</span> <span&gt;static</span> <span&gt;$alipay_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span> =<span&gt; [
    </span><span&gt;//</span><span&gt; 'partner'         => '',//支付宝partner,2088开头数字
    // 'seller_id'         => '',//支付宝partner,2088开头数字
    // 'key'             => '',//支付宝密钥</span>
    'sign_type' => 'MD5','input_charset' => 'utf-8','cacert' => '','transport' => 'http','payment_type' => '1','service' => '',<span&gt;//</span><span&gt;https://docs.open.alipay.com/api_1  看你需要哪个API接口</span>
    'anti_phishing_key' => '','exter_invoke_ip' => '','app_pay' => 'Y',<span&gt;
];

</span><span&gt;public</span> <span&gt;function</span> alipay(<span&gt;$data</span> =<span&gt; [])
{</span><span&gt;//</span><span&gt;发起支付宝支付</span>
    <span&gt;$validate</span> = <span&gt;new</span><span&gt; Validate([
        [</span>'out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no','require|alphaNum','订单编号输入<a href="https://www.jb51.cc/tag/cuowu/" target="_blank">错误</a>1|订单编号输入<a href="https://www.jb51.cc/tag/cuowu/" target="_blank">错误</a>2'],<span&gt;
        [</span>'total_fee','require|number|gt:0','金额输入<a href="https://www.jb51.cc/tag/cuowu/" target="_blank">错误</a>|金额输入<a href="https://www.jb51.cc/tag/cuowu/" target="_blank">错误</a>|金额输入<a href="https://www.jb51.cc/tag/cuowu/" target="_blank">错误</a>'],<span&gt;
        [</span>'subject','require','请输入<a href="https://www.jb51.cc/tag/biaoti/" target="_blank">标题</a>'],<span&gt;
        [</span>'body','请输入描述'],<span&gt;
        [</span>'notify_url','异步<a href="https://www.jb51.cc/tag/tongzhi/" target="_blank">通知</a>地址不为空'],<span&gt;
    ]);
    </span><span&gt;if</span> (!<span&gt;$validate</span>->check(<span&gt;$data</span><span&gt;)) {
        </span><span&gt;return</span> ['code' => 0,'msg' => <span&gt;$validate</span>-><span&gt;getError()];
    }
    </span><span&gt;$con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span> = self::<span&gt;$alipay_con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span><span&gt;;
    </span><span&gt;$con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span>['partner'] = <span&gt;$this</span>-><span&gt;partner;
    </span><span&gt;$con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span>['seller_id'] = <span&gt;$this</span>-><span&gt;partner;
    </span><span&gt;$con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span>['key'] = <span&gt;$this</span>-><span&gt;md5_key;
    <a href="https://www.jb51.cc/tag/vend/" target="_blank">vend</a>or(</span>'alipay.alipay'<span&gt;);
    </span><span&gt;$p<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>meter</span> =<span&gt; [
        </span>"service" => <span&gt;$con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span>['service'],"partner" => <span&gt;$con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span>['partner'],"seller_id" => <span&gt;$con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span>['seller_id'],"payment_type" => <span&gt;$con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span>['payment_type'],"notify_url" => <span&gt;$data</span>['notify_url'],"return_url" => <span&gt;$data</span>['return_url'],"anti_phishing_key" => <span&gt;$con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span>['anti_phishing_key'],"exter_invoke_ip" => <span&gt;$con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span>['exter_invoke_ip'],"out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no" => <span&gt;$data</span>['out_<a href="https://www.jb51.cc/tag/Trad/" target="_blank">Trad</a>e_no'],"subject" => <span&gt;$data</span>['subject'],"total_fee" => <span&gt;$data</span>['total_fee'],"body" => <span&gt;$data</span>['body'],"_input_charset" => <span&gt;$con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span>['input_charset'],<span&gt;

    ];
    </span><span&gt;$alipaySubmit</span> = <span&gt;new</span> AlipaySubmit(<span&gt;$con<a href="https://www.jb51.cc/tag/fig/" target="_blank">fig</a></span><span&gt;);
    </span><span&gt;return</span> ['code' => 1,'msg' => <span&gt;$alipaySubmit</span>-><a href="https://www.jb51.cc/tag/buildr/" target="_blank">buildr</a>equestForm(<span&gt;$p<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>meter</span>,"get","确认"<span&gt;)];
}

}

?>

wx.html在使用微信客户端支付时需要的页面

微信公众号支付
Email:361169632@qq.com注明出处:

ThinkPHP 使用微信支付V3

ThinkPHP 使用微信支付V3

相信大家总是在支付环节出错 ,石头特地送上例子。
1、设置测试目录
在微信公众平台设置,支付测试状态下,设置测试目录,测试人的微信号添加到白名单,发起支付的页面目录必须与设置的精确匹配。并将支付链接发到对应的公众号会话窗口中才能正常发起支付测试。注意正式目录一定不能与测试目录设置成一样,否则支付会出错。
ThinkPHP 使用微信支付V3

2、设置正式支付目录
根据图中栏目顺序进入修改栏目,勾选JSAPI网页支付开通该权限,并配置好支付授权目录,该目录必须是发起支付的页面的精确目录,子目录下无法正常调用支付。
ThinkPHP 使用微信支付V3
3,网页账号
首先登录管理后台->点击开发者中心->网页账号,并点击修改
如果网页账号不填写会报redirect_uri参数错误

准备工作做完 然后 然后 然后直接上石头给大家的代码即可

附件 Thinkphp - way.rar ( 1.09 MB 下载:9 次 )

今天的关于thinkphp整合微信支付代码分享thinkphp对接微信支付的分享已经结束,谢谢您的关注,如果想了解更多关于PHP编程:Thinkphp和onethink实现微信支付插件、ThinkPHP 5 支付宝微信支付(支付宝H5,微信H5、APP支付、公众号支付)、ThinkPHP 5 整合支付宝微信支付(支付宝H5,微信H5、APP支付、公众号支付)、ThinkPHP 使用微信支付V3的相关知识,请在本站进行查询。

本文标签: