ホームページ  >  記事  >  バックエンド開発  >  [PHP バックエンド] Alipay に接続する

[PHP バックエンド] Alipay に接続する

WBOY
WBOYオリジナル
2016-06-23 13:15:131481ブラウズ

PHP は主にクライアントのバックエンドで使用しており、フロントエンドの Web ページの作り方がわかりません。過去 2 日間、会社のプロジェクトのニーズにより、支払い機能を接続する必要がありました。当然、最初に矢面に立たされるのは Alipay です。反復バージョンのニーズを考慮すると、Alipay 機能が最初に接続されます。その他の支払い機能は今後の反復バージョンで追加される予定です。でも、死にたくなるような支払い機能ですよ〜

まずはロジックを整理しましょう

1. サーバーは、注文署名を生成します。2. クライアント (iOS/Android) は、支払いのために Alipay を呼び出します。注文の署名; 3. Alipay がバックエンドにコールバックし、支払いが完了します。 4. バックエンドが Alipay から通知を受け取り、その通知を検証します。


ping++

ついに諦めました、ここで愚痴を言いたいだけです~ ネットで情報を調べたところ、良さそうなものを見つけました:ping++の決済SDK、かなり良さそうですよ~ ~ [登録]->[ [アプリケーションの追加] -> [各種キーのアップロード] - >[PHP 統合 SDK] すべてが予想どおりに進んでいるように見えます。実際、最初は支払いにお金が関係しているため、多少の抵抗がありました。危険な方法で行われたわけではありません...これらのキーはすべて ping++ に渡した後、会社の Alipay のさまざまな公開キーと秘密キーを取得しました... ping++ のドキュメントによると、署名情報を生成する最初のステップを完了した後、クライアントに返され、クライアントは署名情報を使用して支払いを完了しますが、その後の手順はありません。 ping++ では、署名情報を生成するときに通知 URL を設定する場所がなかった可能性もあります。ドキュメントをよく読んでください〜 ping++のカスタマーサービスに相談したところ、ping++が作成したものだと言われました クライアントは独自のサーバーに通知します〜

現時点では、安全性が最優先であるため、ping++をあきらめるしかありませんお金が発生し、クライアントがサーバーに通知するロジックは、次の状況では実行できません:

1. 支払いが成功した後、クライアントが突然プログラムを終了します (クラッシュ、停電、プログラムのクラッシュなど)。 ; 2. リクエストがハイジャックされ、情報が改ざんされる (金額、数量、または支払いがまったく行われない)

さらに、ping++ は作業指示の処理に時間がかかりすぎ、カスタマー サービスの応答も遅くなります。は将来的に大きな問題であり、時間内に対処する必要があり、誰かを見つけるのは面倒なので、放棄するしかありません〜


Alipay SDK

最初から始めましょう:

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 を使用します);

rrree

method $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. 支払い署名を生成するときに

notify_url

を設定します。支払いが成功すると、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. サーバーはコールバックが正当かどうかを検証します このステップは非常に重要です。

1. 署名を確認する; 2. 通知が Alipay によって開始されたかどうかを確認する

//正确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方式加密和解密的我并没有去测试,如果你弄了,欢迎交流。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。