銀聯支払(ネットバンクh 5)

6104 ワード

杉徳全支払いプラットフォーム
必要な資料:
1.取引先の公開鍵の取得方法:まず証明書をインストールし(注意:証明書はメールを受け取ってから14日以内にダウンロードして、しかも一回しかダウンロードできない)、それからIEで開くhttps://cs.cfca.com.cn/cgi-bin/userCertDownload/v_input.do?displayAgreement=true「ツール-インターネットオプション」をクリックして証明書を表示し、証明書の商家番号がメールボックスで送信された商家番号と一致しているかどうかを確認し、公開鍵をエクスポートします.
2.取引先秘密鍵は上の公開鍵の導出方式と同じである
3.秘密鍵証明書のパスワード公開鍵のエクスポート時に設定されたパスワード
ステップの開始
1.受け取った開通メールによって、CFCA公式サイトに登録するデジタル証明書ダウンロードプラットフォームを見つけるhttps://cs.cfca.com.cn/cgi-bin/userCertDownload/v_input.do?displayAgreement=trueを使用して、このメールで提供された証明書のシリアル番号と認証コードを使用して、暗号化証明書のインストールをダウンロードし、プロセスに従って、ユーザー公開鍵(接尾辞.cer)とユーザー秘密鍵(ファイル接尾辞.pfx)のファイル公開鍵秘密鍵エクスポートマニュアルをエクスポートします.https://open.sandpay.com.cn/developmentAccess/guide?msg=6684
2.メールボックスの商家番号を使用してオープンプラットフォームにアカウントを登録し、オープンプラットフォーム-パラメータ設定に公開鍵をアップロードし、編集が完了したらページをリフレッシュして監査状態を確認してください.ステータスが「レビュー済み」と表示されてから1時間ほどで有効になりますので、お待ちください.(登録して登録する必要があり、登録時に口座開設メールの商家番号で登録する)
3.開発文書を見つけるhttps://open.sandpay.com.cn//developmentAccess/moredoc?openpage=demoインタフェースドキュメントにdemoが提供され、対応するdemoファイルがダウンロードされます.
4.前の公開鍵、秘密鍵、秘密鍵パスワード、商家番号を配置し、ダウンロードした公開鍵、秘密鍵ファイルをプロジェクトcertファイルの下に置いて、配置し、秘密鍵パスを取得する
 array(
                'version' => '1.0',
                'method' => 'sandpay.trade.pay',
                'productId' => '00000008',
                'accessType' => '1',
                'mid' => $this->mid,
                'channelType' => '07',
                'reqTime' => date('YmdHis', time())
            ),
            'body' => array(
//                'orderCode' => $_GET['order_id'],//     
                'orderCode' => time(),//     
                'totalAmount' =>'000000000001',//    
                'subject' => '  ',//    
                'body' => '',//    
                'txnTimeOut' => 20181116202020,//      
                'payMode' => 'sand_h5',//     sand_h5 h5       bank_pc        
                'payExtra' => json_encode(array('cardNo' =>$bank_num)),//    
                'clientIp' => get_client_ip(),//   IP
                'notifyUrl' => $this->notifyUrl,//    
                'frontUrl' => $this->frontUrl,//    
                'extend' => ''
            )
        );
        // step2:     
        $prikey = loadPk12Cert(PRI_KEY_PATH, CERT_PWD);
        $sign = sign($data, $prikey);
        // step3:   post  
        $post = array(
            'charset' => 'utf-8',
            'signType' => '01',
            'data' => json_encode($data),
            'sign' => $sign
        );

        // step4: post  
        $result = http_post_json(API_HOST . '/order/pay', $post);
        $arr = parse_result($result);

        //step5:     
        $pubkey = loadX509Cert(PUB_KEY_PATH);

        try {
            verify($arr['data'], $arr['sign'], $pubkey);
        } catch (Exception $e) {
            echo $e->getMessage();
            exit;
        }
        // step6:   credential
        $data = json_decode($arr['data'], true);
        if ($data['head']['respCode'] == "000000") {
            $credential = $data['body']['credential'];
            return $credential;
        } else {
            print_r($arr['data']);
        }
    }

    /**
     *     
     */
    public function notifyUrl(){
      $data = file_get_contents("php://input");
        if(!empty($data)){
            Checking::writeLog('    ','','bank.txt');
            parse_str($data,$backData);
            if($backData['data']){
                $arrData = json_decode($backData['data'],true);
                $orderCode = $arrData['body']['orderCode'];
                $where = [
                    'pay_order_num' => $orderCode,
                    'status' => 1
                ];
                $info = Db::name('orders')->where($where)->find();
                Checking::writeLog('    ', '   -' . json_encode($info),'bank.txt');
                if ($info['status'] == 1) {
                    Db::startTrans();
                    try {
                        #    
                        Db::commit();
                        Checking::writeLog('    ', '    -' . $info['sale_area'],'bank.txt');
                        exit('success');
                    } catch (Exception $exception) {
                        Db::rollback();
                        Checking::writeLog($exception->getMessage(), '    -' . $info['sale_area'],'bank.txt');
                        exit('fail');
                    }
                }
            }
        }
    }

    /**
     *     
     */
    public function frontUrl(){

    }
}

よくあるエラーを下に置きます.
1.署名に失敗しました
可能な理由
(1)cfcaからエクスポートしたユーザーの公開鍵が準備されていることを確認し、準備されてから約1時間で有効になります.
(2)プロジェクトで使用する公開鍵がスギド公開鍵であることを確認してください(sand.cerは報告ページで直接ダウンロードできます).
(3)プロジェクトで使用する秘密鍵と報告された公開鍵がペアであり、商家番号に対応していることを確認してください.確認しない場合は、報告を再エクスポートしてください.
(4)正しい商家番号が使用されていることを確認してください.
(5)中英語または特殊文字の問題で、非同期アドレスに特殊記号を含めることはできません(一番後ろに/を付けることはできません).
プロジェクトコードリンクhttps://gitee.com/jmk/payment