PHP は主にクライアントのバックエンドで使用しており、フロントエンドの Web ページの作り方がわかりません。過去 2 日間、会社のプロジェクトのニーズにより、支払い機能を接続する必要がありました。当然、最初に矢面に立たされるのは Alipay です。反復バージョンのニーズを考慮すると、Alipay 機能が最初に接続されます。その他の支払い機能は今後の反復バージョンで追加される予定です。でも、死にたくなるような支払い機能ですよ〜
まずはロジックを整理しましょう
1. サーバーは、注文署名を生成します。2. クライアント (iOS/Android) は、支払いのために Alipay を呼び出します。注文の署名; 3. Alipay がバックエンドにコールバックし、支払いが完了します。 4. バックエンドが Alipay から通知を受け取り、その通知を検証します。
ついに諦めました、ここで愚痴を言いたいだけです~ ネットで情報を調べたところ、良さそうなものを見つけました:ping++の決済SDK、かなり良さそうですよ~ ~ [登録]->[ [アプリケーションの追加] -> [各種キーのアップロード] - >[PHP 統合 SDK] すべてが予想どおりに進んでいるように見えます。実際、最初は支払いにお金が関係しているため、多少の抵抗がありました。危険な方法で行われたわけではありません...これらのキーはすべて ping++ に渡した後、会社の Alipay のさまざまな公開キーと秘密キーを取得しました... ping++ のドキュメントによると、署名情報を生成する最初のステップを完了した後、クライアントに返され、クライアントは署名情報を使用して支払いを完了しますが、その後の手順はありません。 ping++ では、署名情報を生成するときに通知 URL を設定する場所がなかった可能性もあります。ドキュメントをよく読んでください〜 ping++のカスタマーサービスに相談したところ、ping++が作成したものだと言われました クライアントは独自のサーバーに通知します〜
現時点では、安全性が最優先であるため、ping++をあきらめるしかありませんお金が発生し、クライアントがサーバーに通知するロジックは、次の状況では実行できません:
1. 支払いが成功した後、クライアントが突然プログラムを終了します (クラッシュ、停電、プログラムのクラッシュなど)。 ; 2. リクエストがハイジャックされ、情報が改ざんされる (金額、数量、または支払いがまったく行われない)
さらに、ping++ は作業指示の処理に時間がかかりすぎ、カスタマー サービスの応答も遅くなります。は将来的に大きな問題であり、時間内に対処する必要があり、誰かを見つけるのは面倒なので、放棄するしかありません〜
最初から始めましょう:
Alipay
1. まず Alipay オープンプラットフォームにアカウントを登録します; 2. 公式デモをダウンロードします; 3. さまざまなキーを取得し、alipay.config.php ファイルで設定します $alipay_config['key'] RSA 署名の場合は必須ではありませんが、公開鍵と秘密鍵を生成する必要があります (ここでは例として MD5 を使用します)。
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓//合作身份者id,以2088开头的16位纯数字$alipay_config['partner'] = '';//收款支付宝账号,一般情况下收款账号就是签约账号$alipay_config['seller_email'] = '';//安全检验码,以数字和字母组成的32位字符$alipay_config['key'] = '';$alipay_config['success_url'] = "";//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
4. 支払い注文署名を生成します (ここでは例として MD5 を使用します);
rrreemethod $amount は支払総額、$orderNo は販売者プラットフォームの注文番号であり、署名結果がクライアントに返されます。
5. クライアントは支払い署名情報を取得した後、Alipay の SDK を呼び出して直接支払います。結局のところ、この記事の本題はここではありません。支払いは正常に完了しましたが、エラー コードは間違った入力パラメータでした。
支払いに失敗しました ALI38173
Alipay のドキュメントを確認したところ、渡されたパラメータに漏れがないことがわかりました。おそらく、問題は署名の暗号化のエラーです。いろいろ悩んだ結果、createLinkstring メソッドが間違っていることがわかりました。このメソッドによって返される文字列形式は次のとおりです。 key1=value1&key2=value2...
しかし、クライアントがそれを Alipay に渡すと、Alipay は同じメソッドを使用します。検証のために署名が生成されますが、検証は失敗します。 createLinkstring メソッドは、各値が引用符で囲まれるように変更されました: key1="value1"&key2="value2".... これにより、クライアントは支払いを完了できます。 require_once("lib/alipay_core.function.php");require_once("lib/alipay_md5.function.php");function alipaySign($amount,$orderNo){ require_once("alipay.config.php"); $ali = array( 'service' => 'mobile.securitypay.pay', 'partner' => $alipay_config['partner'],// '_input_charset' => $alipay_config['input_charset'], 'notify_url' => $alipay_config['success_url'],//回调地址 'out_trade_no' => $orderNo,//商户网站唯一订单号 'subject' => "subject",//商品名称 'payment_type' => 1,//支付类型 'seller_id' => $alipay_config['seller_email'],//支付宝账号 'total_fee' => $amount,//总金额 'body' => "body",//商品详情 ); $sign_type = $alipay_config['sign_type']; $para_filter = paraFilter($ali); $para_sort = argSort($para_filter); $prestr = createLinkstring($para_sort); $sign = md5Sign($prestr,$alipay_config['key']); $str = $prestr.'&sign='.'"'.$sign.'"'.'&sign_type='.'"'.$sign_type.'"';//传给支付宝接口的数据 return $str; }
6. 支払い署名を生成するときに
を設定します。支払いが成功すると、Alipay はこの URL にコールバックし、post メソッドを通じて支払い結果情報を渡します。 GET メソッドで渡される任意のパラメーター。 function createLinkstring($para) { $arg = ""; $quotes = '"'; foreach ($para as $key => $val) { if($arg == ''){ $arg = $key.'='.$quotes.$val.$quotes; }else{ $arg = $arg.'&'.$key.'='.$quotes.$val.$quotes; } } if(get_magic_quotes_gpc()){$arg = stripslashes($arg);} return $arg;}
7. サーバーはコールバックが正当かどうかを検証します このステップは非常に重要です。
//正确http://host/notify_url//错误http://host/notify_url?name=狍子君
そして、この通知の情報はnotify_id
を通じて Alipay から取得できることがわかりました。失敗した。
function verifyResult(){ require_once("alipay.config.php"); $alipayNotify = new AlipayNotify($alipay_config); $verify_result = $alipayNotify->verifyNotify(); if($verify_result) { return true; }else{ return false; } }
これはcreateLinkstringの別の問題のようですが、
valueの値を引用符なしで渡すことができます。 MD5 暗号化の結果は、Alipay から返されたものとまったく同じです。 変更 createLinkstringメソッド:
function createLinkstring($para,$showQuotes = false) { $arg = ""; $quotes = ''; if($showQuotes){ $quotes = '"'; } foreach ($para as $key => $val) { if($arg == ''){ $arg = $key.'='.$quotes.$val.$quotes; }else{ $arg = $arg.'&'.$key.'='.$quotes.$val.$quotes; } } if(get_magic_quotes_gpc()){$arg = stripslashes($arg);} return $arg;}
在生成支付签名信息的时候,$showQuotes传入为true就可以了。
function alipaySign($amount,$orderNo){ //签名的代码 $prestr = createLinkstring($para_sort,true); //后面的代码}
8.然后在验证通过后,就可以修改自己数据库了;
key1=value1&key2=value2...... key1="value1"&key2="value2"......
就因为这个,把我弄得欲仙欲死,完全不知道什么原因支付不成功,支付成功了又不知为何验证不通过...... 在受尽两天的折磨之后,最后是通过charles截取其他有支付类app的订单签名信息,和自己的比对,才发现原来是引号的问题。 RDS方式加密和解密的我并没有去测试,如果你弄了,欢迎交流。