支付寶wap支付證書公鑰php(支付寶應用公鑰)

本文目錄一覽:

工行支付寶交易的時候提示未找到證書公鑰

攜帶本人身份證和銀行卡到工行網店註銷網上銀行,在重新申請網上銀行,重新下一個U盾驅動。就OK了。

php 支付寶接口官方給的md5簽名版本和rsa簽名版本的區別

雖然支付寶官方還未提供相關SDK,PHP確實可以實現RSA方式的簽名,這點其實很重要,由於不熟悉,在遇到困難的時候,經常會不由自主地想到是否PHP不支持RSA簽名,乾脆用MD5得了,這樣就沒有了前進的動力。其實說穿了MD5和RSA簽名,不同的只是簽名方式的區別,其他的都一樣,因此我這裡主要說一下如何用RSA進行簽名和驗簽。

首先你需要準備下面的東西:

php的openssl擴展里已經封裝好了驗簽的方法openssl_verify。

如果在Windows下的php.ini需要開啟Openssl模塊: extension=php_openssl.dll

商戶私鑰:

即RSA私鑰,按照手冊,按以下方式生成:

openssl genrsa -out rsa_private_key.pem 1024

商戶公鑰:

即RSA私鑰,按照手冊,按以下方式生成:

openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

生成之後,按照手冊的說明,需要在簽約平台上傳公鑰,需要注意的是,上傳的時候需要把所有的注釋和換行都去掉。

另外手冊中還有如下命令:

openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt

該命令將RSA私鑰轉換成PKCS8格式,對於PHP來說,不需要。

支付寶公鑰:

根據手冊,在簽約平台獲得。

如果你直接複製下來的話,會得到一個字符串,需要進行下面的轉換;

1)把空格變成換行

2)添加註釋

比如你複製下來的公鑰是:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRBMjkaBznjXk06ddsL751KyYt

ztPFg0D3tu7jLqCacgqL+lbshIaItDGEXAMZmKa3DV6Wxy+l48YMo0RyS+dWze4M

UmuxHU/v6tiT0ZTXJN3EwrjCtCyyttdv/ROB3CkheXnTKB76reTkQqg57OWW+m9j

TCoccYMDXEIWYTs3CwIDAQAB,那轉換之後為:

—–BEGIN PUBLIC KEY—–

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRBMjkaBznjXk06ddsL751KyYt

ztPFg0D3tu7jLqCacgqL+lbshIaItDGEXAMZmKa3DV6Wxy+l48YMo0RyS+dWze4M

UmuxHU/v6tiT0ZTXJN3EwrjCtCyyttdv/ROB3CkheXnTKB76reTkQqg57OWW+m9j

TCoccYMDXEIWYTs3CwIDAQAB

—–END PUBLIC KEY—–

把公鑰保存在文件里。

注意這個是2048位的公鑰應該是9行或者10行,不能為1行,不然PHP的openssl_pkey_get_public無法讀取,pub_key_id的結果為false,如果沒有—–BEGIN PUBLIC KEY—– 和 —–END PUBLIC KEY—– 可以自己加上,最後保存到一個rsa_public_key.pem文件中。

好了,現在已經有了所有的東西,先看簽名函數:

複製代碼

1 ?php

2 /**

3 * 簽名字符串

4 * @param $prestr 需要簽名的字符串

5 * return 簽名結果

6 */

7 function rsaSign($prestr) {

8 $public_key= file_get_contents(‘rsa_private_key.pem’);

9 $pkeyid = openssl_get_privatekey($public_key);

10 openssl_sign($prestr, $sign, $pkeyid);

11 openssl_free_key($pkeyid);

12 $sign = base64_encode($sign);

13 return $sign;

14 }

15 ?

複製代碼

注意點:

1.$prestr的內容和MD5一樣(參見手冊,但不包含最後的MD5密碼)

2.簽名用商戶私鑰

3.最後的簽名,需要用base64編碼

4.這個函數返回的值,就是這次請求的RSA簽名。

驗簽函數:

複製代碼

1 ?php

2 /**

3 * 驗證簽名

4 * @param $prestr 需要簽名的字符串

5 * @param $sign 簽名結果

6 * return 簽名結果

7 */

8 function rsaVerify($prestr, $sign) {

9 $sign = base64_decode($sign);

10 $public_key= file_get_contents(‘rsa_public_key.pem’);

11 $pkeyid = openssl_get_publickey($public_key);

12 if ($pkeyid) {

13 $verify = openssl_verify($prestr, $sign, $pkeyid);

14 openssl_free_key($pkeyid);

15 }

16 if($verify == 1){

17 return true;

18 }else{

19 return false;

20 }

21 }

22 ?

複製代碼

注意點:

1.$prestr的內容和MD5一樣(參見手冊)

2.$sign是支付寶接口返回的sign參數用base64_decode解碼之後的二進制

3.驗簽用支付寶公鑰

4.這個函數返回一個布爾值,直接告訴你,驗簽是否通過

支付寶官方提供的PHP版SDK demo中只對MD5加密方式進行了處理,但android 端和ios端 請求支付寶加密方式只能用RSA加密算法,這時服務端PHP就無法驗證簽名了,所以需要對demo進行一些修改。

1、修改alipay_notify.class.php文件

verifyNotify 函數第46行

$isSign = $this-getSignVeryfy($_POST, $_POST[“sign”]);

改成

$isSign = $this-getSignVeryfy($_POST, $_POST[“sign”], $_POST[“sign_type”]);

verifyReturn 函數第83行

$isSign = $this-getSignVeryfy($_GET, $_GET[“sign”]);

改成

$isSign = $this-getSignVeryfy($_GET, $_GET[“sign”], $_GET[“sign_type”]);

getSignVeryfy 函數 116行

function getSignVeryfy($para_temp, $sign) {

改成

function getSignVeryfy($para_temp, $sign, $sign_type) {

getSignVeryfy 函數 127行

switch (strtoupper(trim($this-alipay_config[‘sign_type’]))) {

case “MD5” :

$isSgin = md5Verify($prestr, $sign, $this-alipay_config[‘key’]);

break;

default :

$isSgin = false;

}

改成

switch (strtoupper(trim($sign_type))) {

case “MD5” :

$isSgin = md5Verify($prestr, $sign, $this-alipay_config[‘key’]);

break;

case “RSA” :

$isSgin = rsaVerify($prestr, $sign);

break;

default :

$isSgin = false;

}

2、新建一個alipay_rsa.function.php文件

複製代碼

1 ?php

2 /* *

3 * RSA

4 * 詳細:RSA加密

5 * 版本:3.3

6 * 日期:2014-02-20

7 * 說明:

8 * 以下代碼只是為了方便商戶測試而提供的樣例代碼,商戶可以根據自己網站的需要,按照技術文檔編寫,並非一定要使用該代碼。

9 * 該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。

10 */

11 /**

12 * 簽名字符串

13 * @param $prestr 需要簽名的字符串

14 * return 簽名結果

15 */

16 function rsaSign($prestr) {

17 $public_key= file_get_contents(‘rsa_private_key.pem’);

18 $pkeyid = openssl_get_privatekey($public_key);

19 openssl_sign($prestr, $sign, $pkeyid);

20 openssl_free_key($pkeyid);

21 $sign = base64_encode($sign);

22 return $sign;

23 }

24 /**

25 * 驗證簽名

26 * @param $prestr 需要簽名的字符串

27 * @param $sign 簽名結果

28 * return 簽名結果

29 */

30 function rsaVerify($prestr, $sign) {

31 $sign = base64_decode($sign);

32 $public_key= file_get_contents(‘rsa_public_key.pem’);

33 $pkeyid = openssl_get_publickey($public_key);

34 if ($pkeyid) {

35 $verify = openssl_verify($prestr, $sign, $pkeyid);

36 openssl_free_key($pkeyid);

37 }

38 if($verify == 1){

39 return true;

40 }else{

41 return false;

42 }

43 }

44 ?

php開發中app怎麼接入支付寶

準備工作

APP支付接口:alipay.trade.app.pay

服務器端使用框架:TP5

登錄螞蟻金服開放平台 — 創建應用 — 添加App支付功能。具體查看官方文檔

下載官方 SDK (PHP版本資源)——當前SDK版本:106 生成時間:2017-07-25 11:46:10

將SDK原碼放置在TP5的vendor目錄下的alipay文件夾(可根據實際使用框架技術進行實際調整)。

支付接口調用原理

1、APP支付系統架構

APP支付系統架構圖

2、數據校驗原理

數據校驗原理

應用公鑰(商戶自身的RSA公鑰):支付寶使用該公鑰驗證該交易是商戶發起。

支付寶公鑰(支付寶的RSA公鑰):商戶使用該公鑰驗證該結果是支付寶返回的。

3、系統交互流程

系統交互流程圖

4、支付場景具體實現流程(最詳細圖解)

在集成App支付能力時,建議實現如下支付流程,創建訂單並支付,根據返回的結果確定支付狀態,並進行相應的異常處理,其過程如下圖所示.

支付場景具體實現流程

商家APP在創建訂單並且喚起支付寶APP支付,流程如上圖所示,根據第2.2,3步返回的支付結果,確定支付狀態,並且做相應的異常處理(必要時關閉訂單)

代碼實現

步驟1:商戶APP端請求商戶服務器接口,提交訂單數據。

步驟2:商戶服務器端接收數據,然後對數據進行簽名,返回請求參數到商戶APP端。

官方接口文檔:

——代碼如下:

//vendor();為TP5框架的方法,作用:導入第三方框架類庫

vendor(‘alipay.aop.AopClient’);

vendor(‘alipay.aop.request.AlipayTradeAppPayRequest’);

//實例化支付接口

$aop = new \AopClient();

$aop-gatewayUrl = “”; //支付寶網關

$aop-appId = “應用ID,填寫你的APPID”;

$aop-rsaPrivateKey = “商戶私鑰,您的原始格式RSA私鑰()”;

$aop-alipayrsaPublicKey = “支付寶公鑰”;

$aop-apiVersion = ‘1.0’;

$aop-signType = “簽名方式,如 RSA2 “;

$aop-postCharset = ‘UTF-8’;

$aop-format = “json”;

//實例化具體API對應的request類,類名稱和接口名稱對應,當前調用接口名稱:alipay.trade.app.pay

$appRequest = new \AlipayTradeAppPayRequest();

//SDK已經封裝掉了公共參數,這裡只需要傳入業務參數

$bizcontent = json_encode([

‘body’ = ‘餘額充值’, //訂單描述

‘subject’ = ‘充值’, //訂單標題

‘timeout_express’ = ’30m’,

‘out_trade_no’ = ‘20170125test01’, //商戶網站唯一訂單號

‘total_amount’ = ‘0.01’, //訂單總金額

‘product_code’ = ‘QUICK_MSECURITY_PAY’, //固定值

]);

$appRequest-setNotifyUrl($url); //設置異步通知地址

$appRequest-setBizContent($bizcontent);

//這裡和普通的接口調用不同,使用的是sdkExecute

$response = $aop-sdkExecute($appRequest);

//htmlspecialchars是為了輸出到頁面時防止被瀏覽器將關鍵參數html轉義,實際打印到日誌以及http傳輸不會有這個問題

echo htmlspecialchars($response);//就是orderString 可以直接給客戶端請求,無需再做處理。

// 如果最後有問題可以嘗試把htmlspecialchars方法去掉,直接返回$response

說明:sdkExecute()方法,作用生成簽名,詳細步驟如下:

將請求參數組裝分下列3步,以最後第三步獲取到的請求為準。

1)將請求參數的鍵按字典排序,然後按照key=valuekey=value方式拼接,得到未簽名原始字符串如下:

app_id=2015052600090779biz_content={“timeout_express”:”30m”,”product_code”:”QUICK_MSECURITY_PAY”,”total_amount”:”0.01″,”subject”:”1″,”body”:”我是測試數據”,”out_trade_no”:”IQJZSRC1YMQB5HU”}charset=utf-8format=jsonmethod=alipay.trade.app.pay¬ify_url=;sign_type=RSA2×tamp=2016-08-25 20:26:31version=1.0

2)再對原始字符串進行簽名

app_id=2015052600090779biz_content={“timeout_express”:”30m”,”product_code”:”QUICK_MSECURITY_PAY”,”total_amount”:”0.01″,”subject”:”1″,”body”:”我是測試數據”,”out_trade_no”:”IQJZSRC1YMQB5HU”}charset=utf-8format=jsonmethod=alipay.trade.app.pay¬ify_url=;sign_type=RSA2×tamp=2016-08-25 20:26:31version=1.0sign=cYmuUnKi5QdBsoZEAbMXVMmRWjsuUj+y48A2DvWAVVBuYkiBj13CFDHu2vZQvmOfkjE0YqCUQE04kqm9Xg3tIX8tPeIGIFtsIyp/M45w1ZsDOiduBbduGfRo1XRsvAyVAv2hCrBLLrDI5Vi7uZZ77Lo5J0PpUUWwyQGt0M4cj8g=

3)最後對請求字符串的所有一級value(biz_content作為一個value)進行encode,編碼格式按請求串中的charset為準,沒傳charset按UTF-8處理,獲得最終的請求字符串:

app_id=2015052600090779biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%22IQJZSRC1YMQB5HU%22%7Dcharset=utf-8format=jsonmethod=alipay.trade.app.pay¬ify_url=http%3A%2F%2Fdomain.merchant.com%2Fpayment_notifysign_type=RSA2×tamp=2016-08-25%2020%3A26%3A31version=1.0sign=cYmuUnKi5QdBsoZEAbMXVMmRWjsuUj%2By48A2DvWAVVBuYkiBj13CFDHu2vZQvmOfkjE0YqCUQE04kqm9Xg3tIX8tPeIGIFtsIyp%2FM45w1ZsDOiduBbduGfRo1XRsvAyVAv2hCrBLLrDI5Vi7uZZ77Lo5J0PpUUWwyQGt0M4cj8g%3D

步驟3:商戶APP接收從商戶服務器端返回的請求參數,然後調起支付寶支付面板。

若用戶支付成功,支付寶會同步給商戶APP端返回一個支付結果。相應地,支付寶也會通過異步通知給商戶服務器端返回一個支付結果。

注意:由於同步通知和異步通知都可以作為支付完成的憑證,且異步通知支付寶一定會確保發送給商戶服務端。為了簡化集成流程,商戶可以將同步結果僅僅作為一個支付結束的通知(忽略執行校驗),實際支付是否成功,完全依賴服務端異步通知。

步驟4:服務端異步通知處理機制(支付寶主動發起通知,該方式才會被啟用)

官方接口文檔:

注意點:

1)必須保證服務器異步通知頁面(notify_url)上無任何字符,如空格、HTML標籤、開發系統自帶拋出的異常提示信息等;

2)支付寶是用POST方式發送通知信息,因此該頁面中獲取參數的方式,如:$_POST[‘out_trade_no’];

3)程序執行完後必須打印輸出“success”(不包含引號)。如果商戶反饋給支付寶的字符不是success這7個字符,支付寶服務器會不斷重發通知,直到超過24小時22分鐘。一般情況下,25小時以內完成8次通知(通知的間隔頻率一般是:4m,10m,10m,1h,2h,6h,15h);

4)當商戶收到服務器異步通知並打印出success時,服務器異步通知參數notify_id才會失效。

——代碼如下:

$aop = new AopClient;

$aop-alipayrsaPublicKey = ‘請填寫支付寶公鑰,一行字符串’;

$flag = $aop-rsaCheckV1($_POST, NULL, “RSA2”); //驗證簽名

if($flag){

//校驗通知數據的正確性

$out_trade_no = $_POST[‘out_trade_no’]; //商戶訂單號

$trade_no = $_POST[‘trade_no’]; //支付寶交易號

$trade_status = $_POST[‘trade_status’]; //交易狀態trade_status

$total_amount = $_POST[‘’total_amount’]; //訂單的實際金額

$app_id = $_POST[‘app_id’];

if($app_id!=$this-config[‘app_id’]) exit(‘fail’); //驗證app_id是否為該商戶本身

//只有交易通知狀態為TRADE_SUCCESS或TRADE_FINISHED時,支付寶才會認定為買家付款成功。

if($trade_status != ‘TRADE_FINISHED’ $trade_status != ‘TRADE_SUCCESS’)

exit(‘fail’);

//校驗訂單的正確性

if(!empty($out_trade_no)){

//1、商戶需要驗證該通知數據中的out_trade_no是否為商戶系統中創建的訂單號;

//2、判斷total_amount是否確實為該訂單的實際金額(即商戶訂單創建時的金額);

//3、校驗通知中的seller_id(或者seller_email) 是否為out_trade_no這筆單據的對應的操作方(有的時候,一個商戶可能有多個seller_id/seller_email)。

//上述1、2、3有任何一個驗證不通過,則表明本次通知是異常通知,務必忽略。在上述驗證通過後商戶必須根據支付寶不同類型的業務通知,正確的進行不同的業務處理,並且過濾重複的通知結果數據。

//校驗成功後在response中返回success,校驗失敗返回failure

}

exit(‘fail’);

}

echo”fail”; //驗證簽名失敗

步驟5:當商戶APP端接收到支付寶的同步返回結果為成功時,商戶APP端再請求商戶服務器端API,判斷訂單最終支付結果,並做出最終響應。

支付寶公鑰怎麼生成

簽約成功後,支付寶官方客服會給對應人公鑰。 附註: 商戶公鑰簽約流程:1簽約前的資料準備2.選擇適合自己的產品3.審核4.技術集成。 支付寶密鑰和商戶ID就是支付寶數字證書的加密碼,為了保證安全而設置的。

原創文章,作者:ZS7JC,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/130227.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ZS7JC的頭像ZS7JC
上一篇 2024-10-03 23:28
下一篇 2024-10-03 23:28

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • Java微信支付寶分賬指南

    本文將詳細介紹如何使用Java代碼實現微信和支付寶分賬功能,以及實現自定義分賬規則和查詢分賬結果。 一、微信支付分賬 微信支付分賬是指商戶將訂單的資金分給多個分賬接收方。常用於分潤…

    編程 2025-04-28
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • 如何優雅地排版套打證書

    本文將從多個方面,為大家介紹如何優雅地排版套打證書,並給出相應的代碼示例。 一、選擇合適的字體 套打證書的字體必須要優雅、大方、優秀、清晰,所以應該選擇像宋體、楷體、方正、微軟雅黑…

    編程 2025-04-28
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若服務器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27
  • PHP登錄頁面代碼實現

    本文將從多個方面詳細闡述如何使用PHP編寫一個簡單的登錄頁面。 1. PHP登錄頁面基本架構 在PHP登錄頁面中,需要包含HTML表單,用戶在表單中輸入賬號密碼等信息,提交表單後服…

    編程 2025-04-27
  • 證書套打軟件的使用及開發

    證書套打軟件是指用於自動化生成、編輯和打印各種證書、獎狀、證明等文檔的計算機程序。本文介紹證書套打軟件的使用及基於Python語言開發的證書套打軟件實現。 一、軟件的使用 證書套打…

    編程 2025-04-27
  • PHP與Python的比較

    本文將會對PHP與Python進行比較和對比分析,包括語法特性、優缺點等方面。幫助讀者更好地理解和使用這兩種語言。 一、語法特性 PHP語法特性: <?php // 簡單的P…

    編程 2025-04-27
  • PHP版本管理工具phpenv詳解

    在PHP項目開發過程中,我們可能需要用到不同版本的PHP環境來試驗不同的功能或避免不同版本的兼容性問題。或者我們需要在同一台服務器上同時運行多個不同版本的PHP語言。但是每次手動安…

    編程 2025-04-24

發表回復

登錄後才能評論