WeChat決済-カード決済

9062 ワード

WeChat支払-支払コードをスキャンして支払う方法


先日、プロジェクトに微信の支払いが必要だったため、スキャンコードを通じて微信の支払いコードをスキャンし、微信の支払いカードを呼び出してapiの引き落としを支払った.そこでこの記事では、カード決済apiの使い方についても紹介します.
まず、微信の公式提供の支払いdemoを見てみましょう.リンク:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=5_1#
appid(あなたの公衆番号appid)、mchid(微信支払業者番号)、key(微信支払業者鍵)、appsecret(微信のsecert)を記入する必要があります.そしてboby(商品名)、total_fee(支払い金額)、auth_コード.
これらの情報の入手方法については、WxPay.Config.phpファイルに見えます.他のパラメータdemoに書いてあります.そのまま持ってきて使えばいいです.
ユーザーの支払コードと商品名と金額を取得する手順です.次に、スイープされた支払いapiメソッドmicropay()の送信を呼び出す.ウィーチャットにリクエストを送信し、リクエストに成功したリクエストエラーが含まれている一連の配列に戻ります.返されたデータは、微信決済ドキュメントで詳細に表示されます.https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10&index=1
返されたデータにresultフィールドがあることを覚えておいてください.このフィールドでは、ユーザーが支払いに成功したかどうか、success=成功、fail=失敗を判断できます.
微信側は戻ってきたデータを検証します.
//②、      ,        
        if($result["return_code"] == "SUCCESS" &&
           $result["result_code"] == "FAIL" && 
           $result["err_code"] != "USERPAYING" && 
           $result["err_code"] != "SYSTEMERROR")
        {
            return false;
        }

微信側がカード決済を処理する流れは、返却結果に基づいて注文方法を調べると、10回繰り返し、1回約2秒かかります.10回後に変更がない場合は、注文の取り消し方法を呼び出します.
   //③、        
        $queryTimes = 2;
        while ($queryTimes > 0) {
            $succResult = 0;
            $queryResult = $this->query($out_trade_no, $succResult);
            //      1s   
            echo $succResult;
            if ($succResult == 2) {
                sleep(10);
                $error = array(
                    'result' => 'Payment error'
                );
           exit(json_encode($error));
            } else if ($succResult == 1) {//    
                $success = array(
                    'result' => 'Payment successful'
                );
                echo json_encode($success);
                return $queryResult;
            } else if ($succResult == 3) {//  shibai
                $error = array(
                    'result' => 'Payment error'
                );
           exit(json_encode($error));
            } else {//      
                $error = array(
                    'result' => 'Payment error'
                );
                echo json_encode($error);
                return false;
            }
        }
  /**
     *
     *       
     * @param string $out_trade_no      
     * @param int $succCode       
     * @return 0      ,1      ,2      
     */
    public function query($out_trade_no, &$succCode)
    {
        $queryOrderInput = new WxPayOrderQuery();
        $queryOrderInput->SetOut_trade_no($out_trade_no);
        $result = WxPayApi::orderQuery($queryOrderInput);
 echo $result['trade_state'];
        if ($result["return_code"] == "SUCCESS"
            && $result["result_code"] == "SUCCESS"
        ) {
            //    
            if ($result["trade_state"] == "SUCCESS") {
                $succCode = 1;
                return $result;
            } //     
            else if ($result["trade_state"] == "USERPAYING") {
                $succCode = 2;
                return false;
            } else if ($result["trade_state"] == "PAYERROR") {
                $succCode = 3;
                return false;

            }
        }

        //        “         ”       
        if ($result["err_code"] == "ORDERNOTEXIST") {
            $succCode = 0;
        } else {
            //       ,     
            $succCode = 2;
        }
        return false;
    }

実際に支払う場合、支払い成功(success)、支払い失敗(fail)、支払い中(userbeen)の3つの状態があります.
そのため、店舗で支払いコードをスキャンするにはユーザーが支払いパスワードを入力する必要がある場合があります.それがuserbeenの状態なので、こちらで自分でこの状態を処理し、状態=userbeenであれば注文を繰り返し調べます.20秒を超えるとデフォルトで支払いに失敗します.関連コードはサーバーにあるので、貼らないで、誰かが必要なら教えてくれればいいです.
もちろん他にも、NOTENOUGH(残高不足)、NOTSUPORTCARD(カードがサポートされていないタイプ)などの状態があります.詳細は公式ドキュメントに記載されています.
スキャン支払いについては先にお話しし、後で問題があれば更新します.