ホームページ > バックエンド開発 > PHPチュートリアル > WeChat Paymentアプリのphpバックグラウンドインターフェースの詳細な説明

WeChat Paymentアプリのphpバックグラウンドインターフェースの詳細な説明

小云云
リリース: 2023-03-20 21:28:02
オリジナル
2923 人が閲覧しました

この記事では、WeChat Pay アプリ (2016.10.11) の PHP (7.0) バックグラウンド支払いとコールバック インターフェイスを紹介します。フレームワークは Thinkphp5.0 です。お役に立てれば幸いです。

  • アカウントの各種パラメータ

  • 注文情報

  • prepay_idのリクエスト

  • *APPデータ処理に戻る

  • WeChatコールバック

  • 注文ステータスを変更する


アカウントさまざまなパラメータ

アカウントのさまざまなパラメータは、WeChat がアプリ決済を申請すると、アカウントのメールボックスにメールが送信されます。申請時に WeChat 支払いによって割り当てられる、対応する販売者番号 (MCHID)、APPID および APPSECRET が表示されます。アプリの場合、ユーザーが WeChat のバックエンドでアクセス許可を設定する必要があります。これは非常に重要です。

注文情報

  • ** にコンテンツが保存されます。ショッピング カート ユーザー情報などを含む製品データがバックエンドに送信されます。データを取得した後、最初にデータを検証する必要があります。通常、ここでの検証には、プロジェクトの開始時にクライアントとの送信ルールの設定が含まれます。送信方法、パラメータ名、パラメータの検証方法、ここでは検証に焦点を当て、署名認証が一般的に使用されます:

  • //署名ステップ 1: パラメータを辞書順に並べ替えます

  • これはコードです。例 (フォーマットパラメータは URL パラメータにフォーマットされます):

  • /**
         * 格式化参数格式化成url参数
         */
        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;
        }
    ログイン後にコピー
  • //署名ステップ 2: 文字列の後に KEY を追加します (この KEY はフロントエンド スタッフとのネゴシエーションによって決定されます);


  • //署名ステップ 3: MD5 暗号化;


  • //署名ステップ 4: すべての文字を大文字に変換する


これらを早い段階で解決するプロジェクトの段階で、後から呼び出してください。例:

(後でのみ必要 , $param = $this->request('パラメータ名')) (それだけです); その後、注文情報を事前に保存します。 .

Request prepay_id

ここでコードに直接進みます (インターフェイス ドキュメントのダウンロードはここにあります。アドレス:)。ただし、インターネット上には自分で作成したリクエスト インターフェイスがたくさんありますが、WeChat はパッケージ化されているため、使用してください:

$input = new \app\wxpay\WxPayUnifiedOrder();//这里引用微信的统一下单接口

$input->SetBody($data['gname']['g_name']);//商品或支付单简要描述
$input->SetAttach($data['gname']['g_name']);//置附加数据 
$input->SetOut_trade_no($order_sn); // 商户订单号
$input->SetTotal_fee(intval($data['data']['order_price']*100)); 
$input->SetTime_start(date("YmdHis"));//订单生成时间
$input->SetTime_expire(date("YmdHis", time() + 600));//订单失效时间
$input->SetGoods_tag($data['gname']['g_name']); //商品标记  
$input->SetNotify_url("http://www.weixin.qq.com/wxpay/notify.php"); // 支付成功后的回调地址,
$input->SetTrade_type("APP");
$order = \app\wxpay\WxPayApi::unifiedOrder($input);return $order['prepay_id'];
ログイン後にコピー

公式の WeChat 統合注文インターフェイスの説明アドレスは次のとおりです:

https://pay.weixin.qq .com/wiki/doc/api/app/app.php?chapter=9_1

クライアント情報を返す

$info = array();
//账号的信息一般都放在配置文件里面,用到的地方也很多
$info['appid'] = config('APP_APPID');
$info['partnerid'] = config('APP_MCHID');
$info['package'] = config('APP_PACKAGE');
$info['noncestr'] = $this->random_number();//生成随机数,下面有生成实例,统一下单接口需要
$info['timestamp'] = time();
$info['prepayid'] = $prepay_id;
$info['sign'] = self::_makeSign($info);//生成签名return $info;
ログイン後にコピー

$infoはクライアントが必要とする情報です

乱数インスタンスを生成します

//生成随机数
    public function random_number($len=21,$format='ALL' ){
        $is_abc = $is_numer = 0;
        $password = $tmp ='';
        switch($format){
            case 'ALL':
            $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';            break;
            case 'CHAR':
            $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';            break;
            case 'NUMBER':
            $chars='0123456789';            break;
            default :
            $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';            break;
        } // www.jb51.net
        mt_srand((double)microtime()*1000000*getmypid());        while(strlen($password)<$len){
            $tmp =substr($chars,(mt_rand()%strlen($chars)),1);            if(($is_numer <> 1 && is_numeric($tmp) && $tmp >0 )|| $format == &#39;CHAR&#39;){
                $is_numer = 1;
            }            if(($is_abc <> 1 && preg_match(&#39;/[a-zA-Z]/&#39;,$tmp)) || $format == &#39;NUMBER&#39;){
                $is_abc = 1;
            }
            $password.= $tmp;
        }        if($is_numer <> 1 || $is_abc <> 1 || empty($password) ){
            $password = $this->random_number($len,$format);
        }        return $password;
        }
ログイン後にコピー

WeChatコールバック

支払い結果Notifynotify.php (ここのアドレスは注文時に入力されたコールバックアドレスであり、WeChatはすでにパッケージ化しています) 、ドキュメントのダウンロードアドレス

http://mch.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
実際、このページのメインコードはわずか2行です

[php]ビューplain copy

    $notify = new PayNotifyCallBack();  
    $notify->Handle(false);
ログイン後にコピー

ロジックのほとんどは、ファイルを処理するための Handle 関数にあります WxPay.Notify.php

[php] view plain copy

    final public function Handle($needSign = true)  
        {  
            $msg = "OK";  
            //当返回false的时候,表示notify中调用NotifyCallBack回调失败获取签名校验失败,此时直接回复失败  
            $result = WxpayApi::notify(array($this, &#39;NotifyCallBack&#39;), $msg);  
            if($result == false){  
                $this->SetReturn_code("FAIL");  
                $this->SetReturn_msg($msg);  
                $this->ReplyNotify(false);  
                return;  
            } else {  
                //该分支在成功回调到NotifyCallBack方法,处理完成之后流程  
                $this->SetReturn_code("SUCCESS");  
                $this->SetReturn_msg("OK");  
            }  
            $this->ReplyNotify($needSign);  
        }
ログイン後にコピー

メインコード:

[php] view plain copy

    $result = WxpayApi::notify(array($this, &#39;NotifyCallBack&#39;), $msg);
ログイン後にコピー

Track 関数 Notice file WxPay.Api.php

[php] view plain copy

    public static function notify($callback, &$msg)  
        {  
            //获取通知的数据  
            $xml = $GLOBALS[&#39;HTTP_RAW_POST_DATA&#39;];  
            //如果返回成功则验证签名  
            try {  
                $result = WxPayResults::Init($xml);  
            } catch (WxPayException $e){  
                $msg = $e->errorMessage();  
                return false;  
            }  

            return call_user_func($callback, $result);  
        }
ログイン後にコピー

$GLOBALS['HTTP_RAW_POST_DATA'] を通じてゲイデータを取得し、Init 関数の検証署名などを行います。署名の検証が成功し、コードが実行されます。詳細については、php7 自体が $GLOBALS['HTTP_RAW_POST_DATA'] をサポートしていないことを説明する必要があります。私が言いたいのは、具体的な理由については file_get_contents('php://input ') を使用できるということです。非常に詳細な以下のブログを参照してください (https://my.oschina.net/jiec/blog/) 485359)

[php] view plain copy

return call_user_func($callback, $result);
ログイン後にコピー

つまり、コールバック関数 NotifyCallBack が () 関数と呼ばれ、パラメータ $result を渡します。 NotifyCallBack 関数では、書き換えられた NotifyProcess() 関数が呼び出されます。

NotifyProcess() は問題がないと判断し、情報

[php] view plain copy

$this->SetReturn_code("SUCCESS");  
$this->SetReturn_msg("OK");
ログイン後にコピー

を設定し、最後に this->ReplyNotify 関数を呼び出します。 (this−>ReplyNotify(needSign); 成功の結果をエコーする

関数 ReplyNotify は 1 つのコードを変更する必要があります:

[php] view plain copy

final private function ReplyNotify($needSign = true)  
    {  
        //如果需要签名  
        if($needSign == true &&   
            $this->GetReturn_code($return_code) == "SUCCESS")  
        {  
            $this->SetSign();  
        }  
        WxpayApi::replyNotify($this->ToXml());  
    }
ログイン後にコピー

[php] view plain copy

$this->GetReturn_code($return_code) == "SUCCESS")
ログイン後にコピー

に変更できます[php] view plain copy

$this->GetReturn_code() == "SUCCESS")
ログイン後にコピー

次に、返された情報に基づいて注文ステータスを変更します。主なことは、notify.php に新しいメソッド

//修改订单状态
    public function updateState($data){        if($data){
            $order_sn = $data[&#39;out_trade_no&#39;];\

            $data = array();
            $data[&#39;order_id&#39;] = $order_id;
            //修改订单状态(用curlpost方法请求至thinkphp目录下的Controller里面控制器里面的方法,修改状态)
            $url = &#39;www.test.com&#39;;
            header(&#39;content-type:text/html;charset=utf8&#39;);
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($curl, CURLOPT_POST, true);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            $result = curl_exec($curl);
            curl_close($curl);            if($result == &#39;success&#39;){                return true;
            }else{                return false;
            }

        }
    }
ログイン後にコピー

を作成し、

の下に

を追加します。

$notify = new PayNotifyCallBack();
$notify->Handle(false);
ログイン後にコピー

(notify.php)
//接受参数,修改状态
$xml = file_get_contents("php://input");
$data = json_decode(json_encode(simplexml_load_string($xml, &#39;SimpleXMLElement&#39;, LIBXML_NOCDATA)), true);
$notify->updateState($data);
ログイン後にコピー

相关推荐:

PHP后台接口的一些问题

5 分钟实现微信支付接入教程

php初学者如何学习实现微信支付和支付宝支付的相关教程

以上がWeChat Paymentアプリのphpバックグラウンドインターフェースの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート