1. 程式人生 > >支付寶支付接入(接入與驗證)

支付寶支付接入(接入與驗證)

               

一、概述

開發者生成私鑰、公鑰之後,將公鑰提交給服務窗平臺,同時下載支付寶的公鑰,使用OpenSSL的方式驗證簽名之後便可完成接入。

開發者使用介面之前需要啟用開發者模式,請開啟服務窗平臺開發者模式,點選下方的“啟用開發者模式”按鈕。

建議開發者使用支付寶提供的SDK進行服務窗開發,使用SDK進行開發有以下優點:

  1. SDK會隨著新介面的釋出而同步更新
  2. SDK會隨著老介面的更新而同步更新
  3. SDK讓底層邏輯變得透明和簡單,開發者只需關注於自身的業務邏輯
  4. SDK集成了編碼、簽名等常用方法,開發者無需額外耗費時間
  5. 提供了基於SDK開發的Demo,開發者上手更容易

SDK下載:

Demo下載:

二、填寫開發者閘道器及開發者公鑰

開發者將閘道器地址填入開發者閘道器一欄。

開發者將公鑰檔案去除頭尾、換行和空格後的字串填入開發者公鑰一欄。

轉換前pem檔案格式:-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxLDkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unormYQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/QpkddCVXnZ4bAUaQjXQIDAQAB-----END
PUBLIC KEY-----轉換後的字串:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxLDkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unormYQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/QpkddCVXnZ4bAUaQjXQIDAQAB

如下圖所示:

填寫開發者閘道器、開發者公鑰

三、下載支付寶公鑰

點選“複製公鑰”按鈕,可以獲取支付寶公鑰,支付寶公鑰是經過格式化之後的字串,如果開發者需要使用pem檔案進行驗籤,請

點此下載pem公鑰檔案。

支付寶公鑰:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQABPEM格式化後的支付寶公鑰:-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB-----END PUBLIC KEY-----

四、使用支付寶公鑰進行驗籤

當開發者完成閘道器程式碼的部署之後,便可以點選“提交”按鈕,啟用開發者模式,接入服務窗平臺。

此時,支付寶閘道器會向開發者閘道器傳送一條驗證訊息,以POST方式請求,以下為一個請求示例:

REQUEST URL: https://example.com/gateway.doREQUEST METHOD: POSTCONTENT:    service=alipay.service.check    sign=ntjOmXFGJMdfdMnrTL5rEp9QG8d0lDEoGg3ZHvqemHeI8BlQoEsFbhEn0IfQT+pvfJz5RCuE+3Qh1X7I4z5iTIiGjDBstc0xeuiAmtP9TrJZuw2jUAODFB9qOwBJLNcWlKHUGTU/db/qRsJQCj8EjoJvSi9MRM/xKv/XmduS/C4=    sign_type=RSA    charset=GBK    biz_content=<?xml version="1.0" encoding="gbk"?><XML><AppId><![CDATA[2014072300007148]]></AppId><FromUserId></FromUserId><CreateTime><![CDATA[1406083506817]]></CreateTime><MsgType><![CDATA[event]]></MsgType><EventType><![CDATA[verifygw]]></EventType><ActionParam></ActionParam><AgreementId></AgreementId><AccountNo></AccountNo></XML>

開發者接收到該訊息之後,需要使用支付寶的公鑰對簽名作驗證,以確保該訊息來源可靠。

  1. 將支付寶返回的POST引數(不包含sign引數)做字母排序,組成query型別的字串,比如上文的POST請求組成的query型別字串為:

     biz_content=<?xml version="1.0" encoding="gbk"?><XML><AppId><![CDATA[2014072300007148]]></AppId><FromUserId></FromUserId><CreateTime><![CDATA[1406083506817]]></CreateTime><MsgType><![CDATA[event]]></MsgType><EventType><![CDATA[verifygw]]></EventType><ActionParam></ActionParam><AgreementId></AgreementId><AccountNo></AccountNo></XML>&charset=GBK&service=alipay.service.check&sign_type=RSA
  2. 將簽名引數使用base64解碼為位元組碼串

  3. 使用OpenSSL的驗籤方法及支付寶公鑰驗證簽名,以下為php程式碼的一個片段,其中$data為經過1排序處理後的query字串,$rsaPublicKeyFilePath指支付寶公鑰PEM檔案的檔案地址

     /* 使用支付寶的公鑰對支付寶來的訊息進行驗籤 */ public function verify($data, $sign, $rsaPublicKeyFilePath) {     /* 讀取公鑰檔案,PEM格式 */         $pubKey = file_get_contents($rsaPublicKeyFilePath);     /* 轉換為openssl格式金鑰 */     $res = openssl_get_publickey($pubKey);     /* 呼叫openssl內建方法驗籤 */     $result = (bool) openssl_verify($data, base64_decode($sign), $res);     /* 釋放資源 */     openssl_free_key($res);     /* 返回驗簽結果 */     return $result; }

五、返回驗籤成功訊息

開發者驗籤成功之後,需要向支付寶網關回復一條訊息,表示驗籤成功。支付寶收到符合規則的訊息之後,開發者模式就激活了。以下為回覆訊息的格式(其中biz_content為開發者公鑰):

<?xml version="1.0" encoding="GBK"?><alipay>    <response>        <biz_content>MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxLDkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unormYQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/QpkddCVXnZ4bAUaQjXQIDAQAB</biz_content>        <success>true</success>    </response>    <sign>DXr8LVfHytoZ3RR0K95pzGtA3d9LdpjIjLEis2BDIPQisPwS+FMFxZt9NCMt531EeDj/nbzoIAz8Or7PuqxNfSzNI8qnhirm/Hvr8uedXX9JiQxHu8q3Rw2lJWD8cqQzgf3xwV/+wbN8yuI7s8xjo6odq6NCqrAIu7E0DDfZyKo=</sign>    <sign_type>RSA</sign_type></alipay>

開發者可以參考相關Demo(Demo包請點此下載)。