Douyin ミニプログラム用の Alipay インターフェースをどのように記述しますか?

Douyin ミニプログラム用の Alipay インターフェースをどのように記述しますか?

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);
}
})
}
});

}
});

<<:  なぜ「製品に関しては三流、トラフィックに関しては二流、ユーザーに関しては一流」と言うのでしょうか。

>>:  ヒットイベントを企画する際には、3つの点に注意する必要があります

推薦する

マーケティングプロモーション:故宮のスーパーIPはどのようにして作られたのでしょうか?

約600年の歴史を持つ文化的シンボルである故宮は、巨大なIP宝庫であるだけでなく、多数のサブIPを擁...

ウェブサイト上の否定的な情報を削除するにはどうすればいいですか?ウェブサイトにニュースを削除するよう依頼するにはどうすればいいですか?

ウェブサイト最適化担当者として、ウェブサイトのランキングを最適化し、会社のサーバーを維持することに加...

教育業界における短編動画運用の4つの大きな落とし穴

2020年、大中小の企業がショート動画アカウントをいくつか持っていないと、時代に取り残されたように...

Bステーションのグルメ放送ユーザーが構築したユーザーポートレートを分析!

製品開発のライフサイクル全体を通じて、特定の開発ニーズに基づいて、大規模および小規模のユーザー グル...

完全なイベント計画プログラムのための 9 つの重要なポイント!

マーケティング業務において、マーケティング活動は、地上プロモーションとチャネル登録の担い手として、ト...

解読: Pinduoduo は依存症モデルをどのように扱っているのか?

Pinduoduo は多様なプロモーション手法を採用しており、これが他の電子商取引企業と異なる特徴...

スマートな投資アドバイザー、資産配分、コンテンツ マーケティング... 2017 年に財務管理プラットフォームはどのように変化するのでしょうか?

本稿では、業界変革の背景を簡単にまとめた後、新たな投資ツール、新たな中核路線、新たなソリューション、...

BステーションUPマスターが商品を販売するためのヒント

現在、トラフィックコストは徐々に上昇し、トラフィック配当は徐々に消滅しつつあり、ブランドはよりコスト...

史上最も完成度が高い!オンラインマーケティングとプロモーションチャネルのまとめ!写真は1枚で十分です。保存しました

はじめに:この記事では、インターネット金融(および他の類似業界)における新メディアプロモーションのた...

キャンパスのプロモーションとマーケティングをゼロから始めるにはどうすればよいでしょうか?

新学期が始まり、新学期に向けたキャンパスマーケティング戦争が再び始まろうとしている。大手インターネッ...

電子商取引アプリで新規ユーザーを引き付け、ユーザーを維持するための 2 つの重要なステップ!

モバイルインターネットの後半では、eコマースアプリが新規ユーザーを獲得することがますます困難になり、...

アフリカでの誕生日のお祝い、アフリカの子供たちが誕生日のお祝いを大声で言うのにどれくらいの費用がかかるのでしょうか?

アフリカの誕生日挨拶スローガンあなたの祝福が単なる祝福以上のものとなるようにさらなる幸福をもたらす看...

製品オペレーションの0から1までの全プロセス

この記事の主な目的は、私の製品プロセスを共有し、「メイクアップセパレーション」という製品を例にするこ...

個人がWeChatミニプログラムを作成するにはどうすればいいですか?年間100万ドルを稼ぐのは夢ではない

現時点では、WeChatミニプログラムの収益モデルを発見した人はほとんどおらず、発見した人たちはすで...

イベント企画・プロモーションの3つの方法:ゲームプレイ、普及、分裂!

本日は、基本的な計画機能をベースに、ゲームプレイ計画、コミュニケーション計画、分裂計画という3 つの...