Alipay 決済は、WeChat 決済よりも開発がはるかに簡単です。今日は、Alipay モバイル ウェブサイト決済を例として、実装方法について簡単に説明します。もちろん詳細は省きますが、Alipay を開発して決済に利用したい場合は、Alipay Open Platform に認証登録し、モバイル Web サイトの決済機能を備えたアプリケーションを作成する必要があります。 Alipay の公式ドキュメント (https://docs.open .alipay.com/203/107084/)
1. 開発の準備
開発の前に, 次の情報を準備する必要があります#1. Alipay アプリケーションの appid 2. インターフェース暗号化方式 (RSA または RSA2) を指定します
3. Alipay 公開キー
4. 秘密キーの適用
#2. 支払いの実装
#あまり言うことはありません。コードに直接進みましょう/** * 将要参与签名的参数按要求拼接 * @param $data * author 江南极客 * @return string */ function signQueryString($data){ // 去空 $data = array_filter($data); //签名步骤一:按字典序排序参数 ksort($data); $string_a = http_build_query($data); $string_a = urldecode($string_a); return $string_a; } /** * 支付宝RSA签名加密 * @param $data 要参与加密的参数 * @param $private_key 应用私钥 * author 江南极客 * @return array|string */ function RSASign($data,$private_key){ //要签名的参数字符串 $query_string = signQueryString($data); //应用私钥 $private_key = chunk_split($private_key, 64, "\n"); $private_key = "-----BEGIN RSA PRIVATE KEY-----\n$private_key-----END RSA PRIVATE KEY-----\n"; $private_key_id = openssl_pkey_get_private($private_key); if ($private_key_id === false){ return array(-1,'提供的私钥格式不对'); } $rsa_sign = false; if($data['sign_type'] == 'RSA'){ $rsa_sign = openssl_sign($query_string, $sign, $private_key_id,OPENSSL_ALGO_SHA1); }else if($data['sign_type'] == 'RSA2'){ $rsa_sign = openssl_sign($query_string, $sign, $private_key_id,OPENSSL_ALGO_SHA256); } //释放资源 openssl_free_key($private_key_id); if ($rsa_sign === false){ return array(-1,'签名失败'); } $signature = base64_encode($sign); return $signature; } /** * 支付宝支付 * @param array $params 构造好的支付参数 * author 江南极客 * @return array|string */ function aliPay(array $params){ $public = [ 'app_id' => $params['app_id'], 'method' => $params['method'], 'sign_type' => $params['sign_type'], 'format' => 'JSON', 'charset' => 'utf-8', 'version' => '1.0', 'timestamp' => date('Y-m-d H:i:s'), 'biz_content' => $params['biz_content'], ]; if(!empty($params['notify_url'])){ $public['notify_url'] = $params['notify_url']; } if(!empty($params['return_url'])){ $public['return_url'] = $params['return_url']; } $sign = RSASign($public,$params['private_key']); if(is_array($sign)){ return $sign; } $public['sign'] = $sign; $url = 'https://mapi.alipay.com/gateway.do?'. http_build_query($public,'', '&'); return $url; }
呼び出し例:
$biz_content = [ 'body' => '测试商品x1', 'subject' => '测试商品', 'out_trade_no' => date('YmdHis').rand(1000,9999), 'product_code' => 'QUICK_WAP_WAY', 'total_amount' => 0.01, ]; $notify_url = "https://xxxxxxxx/notify.php";//通知回调地址(必须是可以无障碍访问没有登录验证的地址) $params = [ 'app_id' => '2017xxxxxxxxx6554',//appid 'method' => 'alipay.trade.wap.pay',//接口名称 'sign_type' => 'RSA2',//签名加密方式 'notify_url' => $notify_url, 'biz_content' => json_encode($biz_content),//请求参数 ]; $params['private_key'] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";//应用私钥 $data = aliPay($params); print_r($data);
3 です。コールバック検証
モバイル Web サイトの支払いによって生成されたトランザクションの場合、Alipay は元の支払い API を使用します。渡された非同期通知アドレス notify_url は、支払い結果を販売者システムにパラメータとして通知します。 POSTリクエスト。 Alipayの非同期コールバック通知POSTデータは以下の通りですこのデータを取得後、データの改ざんを防ぐためにビザの署名が必要となります。以下:
/** * 支付宝验证签名 * @param $return_data 支付宝服务器推送给notify_url的数据 * @param $public_key 支付宝公钥 * author 江南极客 * @return bool|int */ function RSAVerify($return_data, $public_key){ if(empty($return_data) || !is_array($return_data)){ return false; } //支付宝公钥 $public_key = wordwrap($public_key, 64, "\n", true); $public_key = "-----BEGIN PUBLIC KEY-----\n$public_key\n-----END PUBLIC KEY-----\n"; $public_key_id = openssl_pkey_get_public($public_key); if($public_key_id === false){ return false; } //除去sign、sign_type两个参数外,凡是通知返回回来的参数皆是待验签的参数。 $sign = $return_data['sign']; $sign_type = trim($return_data['sign_type'],'"'); unset($return_data['sign'], $return_data['sign_type']); $query_string = signQueryString($return_data); $sign = base64_decode($sign); $rsa_verify = 0; if($sign_type == 'RSA'){ $rsa_verify = openssl_verify($query_string, $sign, $public_key_id,OPENSSL_ALGO_SHA1); }else if($sign_type == 'RSA2'){ $rsa_verify = openssl_verify($query_string, $sign, $public_key_id,OPENSSL_ALGO_SHA256); } openssl_free_key($public_key_id); if($rsa_verify == 0 || $rsa_verify == -1){ //Returns 1 if the signature is correct, 0 if it is incorrect, and -1 on error. return false; } return $rsa_verify; }
他の Alipay 支払い方法 (スキャン コード支払い、PC 支払い、APP 支払いなど) も同様の方法で実装されており、いくつかのパラメータを変更するだけで OK!
# #PHP 関連の知識については、PHP チュートリアル をご覧ください。
以上がPHPでAlipay決済を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。