DouyinとAlipayを接続するプロセス まず、サーバー経由でDouyinから提供されるSP注文番号を取得します。 次に、SP 注文番号とその他のデータを Alipay に送信します。 次に、Alipay から返された情報を Douyin 側に渡し、支払いを接続します。 'alipay.class.php' をインクルードします。 'AopSdk.php' をインクルードします。 $risk_info=json_encode(配列('ip'=>$_SERVER['REMOTE_ADDR'])); $配列=配列( 'アプリID'=>'800117472149', 'メソッド'=>'tp.trade.create', '文字セット'=>'utf-8'、 'sign_type'=>'MD5'、 'タイムスタンプ'=>time(), 'バージョン'=>'1.0', '出荷番号'=>'20190727000', 'uid'=>'4ybyfXwNMulvUhBT', '販売者ID'=>'1900011759', '合計金額'=>100, '通貨'=>'CNY'、 '件名'=>'販売者の注文名', 'body'=>'販売者の注文詳細', 'trade_time'=>時間(), '有効時間'=>'20', 'notify_url'=>'https://www.juxunapp.com/', 'リスク情報'=>$リスク情報 ); $aplipay = 新しい alipay($array); $res=$aplipay->pay(); app_id = isset($args['app_id']) ? $args['app_id'] : null; $this->method = isset($args['method']) ? $args['method'] : null; $this->charset = isset($args['charset']) ? $args['charset'] : null; $this->sign_type = isset($args['sign_type']) ? $args['sign_type'] : null; $this->timestamp = isset($args['timestamp']) ? $args['timestamp'] : null; $this->version = isset($args['version']) ? $args['version'] : null; $this->out_order_no = isset($args['out_order_no']) ? $args['out_order_no'] : null; $this->uid = isset($args['uid']) ? $args['uid'] : null; $this->merchant_id = isset($args['merchant_id']) ? $args['merchant_id'] : null; $this->total_amount = isset($args['total_amount']) ? $args['total_amount'] : null; $this->currency = isset($args['currency']) ? $args['currency'] : null; $this->subject = isset($args['subject']) ? $args['subject'] : null; $this->body = isset($args['body']) ? $args['body'] : null; $this->trade_time = isset($args['trade_time']) ? $args['trade_time'] : null; $this->valid_time = isset($args['valid_time']) ? $args['valid_time'] : null; $this->notify_url = isset($args['notify_url']) ? $args['notify_url'] : null; $this->risk_info = isset($args['risk_info']) ? $args['risk_info'] : null; $biz_content = json_encode(配列( 'out_order_no'=>$this->out_order_no、 'uid'=>$this->uid、 'merchant_id'=>$this->merchant_id、 'total_amount'=>$this->total_amount、 '通貨'=>$this->通貨、 'subject'=>$this->件名、 '本文'=>$this->本文、 'trade_time'=>$this->trade_time、 'valid_time'=>$this->valid_time、 'notify_url'=>$this->notify_url、 'リスク情報'=>$this->リスク情報 )); $this->biz_content = $biz_content; $sign['app_id'] = $this->app_id; $sign['method'] = $this->method; $sign['charset']=$this->charset; $sign['sign_type']=$this->sign_type; $sign['timestamp']=$this->timestamp; $sign['version']=$this->version; $sign['biz_content'] = $this->biz_content; $this->sign = md5($this->getSignContent($sign,'utf-8','gx9j1saqpjkjgp024kzm6ypncfufruaxk76xk12b')); } パブリック関数pay() { $url="https://tp-pay.snssdk.com/gateway"; $data=array('app_id'=>$this->app_id,'method'=>$this->method,'charset'=>$this->charset,'sign_type'=>$this->sign_type,'sign'=>$this->sign,'timestamp'=>$this->timestamp,'version'=>$this->version,'biz_content'=>$this->biz_content); $res = json_decode($this->send_post($url,$data),true); //ここでデータをフロントエンドに返し、フロントエンドからAlipayのレジを起動する必要があります $ali_data=配列( '本文'=>$this->本文、 'subject'=>$this->件名、 '本文'=>$this->本文、 '料金'=>$this->合計金額 ); $ali_data2=配列( 'trade_no'=>$res['response']['trade_no'] ); $config=配列( 'ali_app_app_id'=>'2019121069845600', 'ali_app_rsa_pri_key'=>'MIFEowIBAAKCAQEAxAfJcO3atT9LofwrDJuZP09nzUgNW5VKdZmSxHnXLqjzo+w2AIbBVmURTLtyDFAJAB19QZ2BXNtll2pb8rXonqQHZFi+5+cyB2/pLKRRNdaqGlQTbLShpbFhPrVNUFgg/zb2O5XiL1PXH3abNY45fVTiyseDJbIlGq1SeH12A5f5UZTA+/bsUTe2HLgupGltTNA3/OwBsw2u3zgr/aYjsj9mf029+HbzZtVMpJlQ2If80tcE9k8U75u+21H/ujDjKYThVbAKQPDSoUmLWlFPasExqRsKffIZdxbANNsKnXpJAP00NA0Nk06d3xmjfYdZiQtkpMo0myKF5JWUGRz7wwIDAQABAoIBAAFuySMhKesPNl9Nt4bVEE6tJuYSM77KnYu0fqUe+tqlc3psPIzOb1VRUcoMyK2cXCR7ErJLE2n5VInBxkBE4hleu4sZNvP89ZmmUL75yHorQn0ExkuSGmhanopVyuXebwdOgIg49TlBVJ4vQL0od/UZjLrMsIGzBqBmSecFi7pE+9AiGPIW3+AnZ1vzoTr5WwaXENzNj0uRWeXMg3vvxdBJm40pgsbgOrQzTtWgaRgWAjccMTPm4IfHj/FlWaa26BgR6EpjaQjSioOMOYUBEoKkgnFEHO1XCJSPjFNYo8sUgt8/wGMSXa5E2Yey2BY3fDvoSwAxsdki684nmog4A2kCgYEA4tyoVTI+2izwRKwRVqIwqtwswB6Q7OzC7dRcRUZwfoBRwN51S/CxTvBU9WujfjkgsCB5HFhgsfGAMfLzKNhpNdc/jbQtjlEoQAG/WmEM1AwllKs+0pt3ID+vo70YS3mIYIGKM2Lee4Fz0iaBLJGCW69EKGjX1wr1WI4kTG9N8acCgYEA3TVfSPL3sFKga+fW2ME9kdWZmzZQVvpShaN9r/YjErlz4RMvDvN1szKeyRg6YZbMJicxYeLVCWOaXNRwc3C2rVV6C1KSSqSnQd/QKvjzgWadK88RBnk3JDBi5XnqwW2JLqN1VeN8MplSFbdTorbNs+Md3WBzrdIJZnuinc3cEIUCgYAhDuKAt7es90tz1lcYdr38x+TFgi7AN6gYHA/uEFuoM262WjRhgotz41WeBbdnV0/KGpFLbh15EKYLoUmJtC9wpxMdxRm2WWEyIo8NzoKeC78WMPYQnpL3YhBoHdACf4098uJ+pnOhL7X+85lzMyj5z0pxUQXS0kf6RYxIjxeelQKBgBZmDRvp3kKwWyYR96NDDeTyZ/dbbI8iEbEOeO+UUMDYnm8v7hfpdwWKHqHmHiM7jbhfR5TNzxyARWUY7boCs7yhZxY2ajG8smLtMrrnMmDr7wY8lVC+fWLgs2LhEXA8kyNx0bO8sRq+g51HTuSu9e09Fg0QcyYqmmESK8kmyx2xAoGBANA3y+mVo6zKvwYNP/hsivcvQL4+P9lMlyT9J953lJdGUdj7rQI87mg8NamNrAhcfdg5HuXSDlfLhlnW9rT16pc2yCi3n5qZDCpydAmBB2MS91vteRvg05p17tzRIghxQuFSyl+djeEK1KtHcvMcblFL56G7YEAoBhRlkWeiVr0B', 'ali_app_pay_rsa_pub_key' => 'miiaijanbgkkhkig9w0baqefaaocaq8amiibcgkcaqaqaqaqaqafjco3att9lofwrdjuzp09nzugnwvvkdzzmsxhnxlqjzo onqqhzfi+5+cyb2/plkrrndaqglqtblshpbfhprvnufgg/zb2o5xil1pxh3abny45fvtiysedjbilgq1seh12a5f5uzta+/bsute2hlgupglgglgglggltna3/howb2umptnap JLQ2IF80TCE9K8U75U+21H/UJDJKYTHVBAKQPDSOUMLWLFPASEXQRSKFFFIZDXBANNSKNXPJAP00NA0NK06D3XMJFYDZIQTKPMO0MYKF5JWUUGRZ7WIDAQAB ' ); $ウェブサイト="https://www.juxunapp.com/"; $data2 = []; $data2['trade_no'] = $res['response']['trade_no']; //取得したtrade_no注文番号 $data2['app_id'] = $this->app_id; // Toutiao Payment がビジネス パーティに割り当てた ID $data2['sign_type'] = $this->sign_type; // Toutiao が使用する MD5 $data2['timestamp'] = (string)$this->timestamp; //リクエストが送信された時刻 $data2['merchant_id'] = $this->merchant_id; // Toutiao Payment がビジネス パーティに割り当てた Merchant ID $data2['uid'] = $this->uid; // ユーザーの open_id を一意に識別します (これは Toutiao のものです) $data2['total_amount'] = $this->total_amount; // 単位に分割された金額は整数として渡される必要があります $data2['params'] = json_encode(['url' => $this->aliaapppaytest($ali_data , $biz_content , $ali_data2 , $website , $config)]); //Alipay APP支払いのリクエストパラメータは次のとおりです。ここではAlipay SDKを使用しました $stringToBeSigned = $this->getSignContent($data2, $this->charset, 'gx9j1saqpjkjgp024kzm6ypncfufruaxk76xk12b'); //上記のパラメータに再度署名します $data2["sign"] = md5($stringToBeSigned); $data2['pay_channel'] = "ALIPAY_NO_SIGN"; $data2["pay_type"] = "ALIPAY_APP"; $data2['method'] = 'tp.trade.confirm'; $data2['risk_info'] = $this->risk_info; return ['error'=>0 , 'msg'=>'success' , 'data'=>$data2]; // これらのパラメータをフロントエンドに返して処理します // $res を返します。 //json_encode($this->alipayData($res)) を返します。 } パブリック関数 aliaapppaytest($data、$biz_content、$data2、$website、$config){ 'AopSdk.php' が必要です。 $aop = 新しい \AopClient(); $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do"; $aop->appId = $config['ali_app_app_id']; //AlipayアプリID $aop->rsaPrivateKey = $config['ali_app_rsa_pri_key']; //Alipay秘密鍵 $aop->フォーマット = "json"; $aop->charset = "UTF-8"; $aop->signType = "RSA2"; $aop->alipayrsaPublicKey = $config['ali_app_pay_rsa_pub_key']; //Alipay公開鍵 //特定の API に対応するリクエスト クラスをインスタンス化します。クラス名はインターフェイス名に対応します。現在の呼び出しインターフェイス名は alipay.trade.app.pay です。 $request = new AlipayTradeAppPayRequest(); //SDK はパブリック パラメータをカプセル化しているので、ここではビジネス パラメータのみを渡す必要があります。 $data2 = [ '本文' => $data['本文'], '件名' => $data['件名'], 'out_trade_no' => $data2['trade_no'], 'timeout_express' => '30分'、 'total_amount' => $data['fee']/1000, '製品コード' => 'QUICK_MSECURITY_PAY', ]; $postdata = json_encode($data2); $request->setNotifyUrl($website . '/payment/toutiao/notify.php'); // サーバー非同期通知の http アドレス); $request->setBizContent($postdata); //$response = $aop->sdkExecute($request); //これはsdkExecuteを使用する通常のインターフェース呼び出しとは異なります $response = $aop->sdkExecute($request); //htmlspecialchars は、ページに出力するときにブラウザがキー パラメータ HTML をエスケープするのを防ぐために使用されます。この問題は、ログに出力する場合や HTTP 経由で送信する場合は発生しません。 // return htmlspecialchars($str); // orderString は、それ以上処理せずにクライアントに直接リクエストできます。 return $response; //OrderString は、それ以上処理せずにクライアント要求に直接送信できます。 } パブリック関数alipayData($res){ $biz_content=json_encode(配列( 'subject'=>$this->件名、 'out_trade_no'=>$this->out_order_no、 'total_amount'=>$this->total_amount、 '製品コード'=>"QUICK_MSECURITY_PAY" )); $url=配列( 'app_id'=>$this->app_id、 'biz_content'=>$biz_content, 'charset'=>$this->charset、 'メソッド'=>'alipay.trade.app.pay', 'notify_url'=>$this->notify_url、 'sign'=>$res['sign'], 'sign_type'=>'RSA2'、 'タイムスタンプ'=>time(), 'version'=>$this->バージョン ); $url = $this->getSignContent($url,'utf-8',''); $データ=配列( 'app_id'=>$this->app_id、 'sign_type'=>'MD5'、 'timestamp'=>(文字列)$this->timestamp, 'trade_no'=>$res['response']['trade_no'], '販売者ID'=>'1900011747', 'uid'=>'4ybyfXwNMulvUhBT', '合計金額'=>100, 'params'=>json_encode(配列('url'=>$url))、 'sign'=>$this->sign、 'メソッド'=>'tp.trade.confirm', 'pay_channel'=>'ALIPAY_NO_SIGN'、 '支払いタイプ'=>'ALIPAY_APP', 'リスク情報' => $this->リスク情報 ); $data を返します。 } パブリック関数 getSignContent($params, $charset,$app_secret) { $params をソートします。 署名する文字列 = ""; $i = 0; foreach ($params を $k => $v として) { if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) { // ターゲット文字セットに変換する $v = $this->characet($v, $charset); ($i == 0)の場合{ $stringToBeSigned .= "$k" . "=" . "$v"; } それ以外 { $stringToBeSigned .= "&" . "$k" . "=" . "$v"; } $i++; } } 署名する文字列 = $文字列.$app_secret; 設定解除 ($k, $v); $stringToBeSigned を返します。 } パブリック関数 checkEmpty($value) { if (!isset($value)) true を返します。 ($値 === null)の場合 true を返します。 if (trim($value) === "") true を返します。 false を返します。 } パブリック関数characet($data, $targetCharset) { もし(!空($data)) { $fileType = "UTF-8"; strcasecmp($fileType, $targetCharset) != 0 の場合 $data = mb_convert_encoding($data、$targetCharset、$fileType); } } $data を返します。 } パブリック関数 send_post($url, $post_data) { $postdata = http_build_query($post_data); $オプション = 配列( 'http' => 配列( 'メソッド' => 'POST'、 'ヘッダー' => 'コンテンツタイプ:application/x-www-form-urlencoded', 'コンテンツ' => $postdata, 'timeout' => 15 * 60 // タイムアウト(単位:秒) ) ); $context = stream_context_create($options); $result = file_get_contents($url, false, $context); $result を返します。 } } ?> ページ({ データ: {}、 onLoad: 関数 () { }, 支払う: 関数 () { tt.request({ url: 'https://www.juxunapp.com/alipay2/aop/test/index.php', // ターゲット サーバーの URL 成功: 関数 (res) { コンソールログ(res.data.data) tt.requestPayment({ データ:res.data.data、 成功(res) { コンソールログ(res); }, 失敗(res) { コンソールログ(res); } }) } }); } }); |