簽名和驗簽在APP端也是可以完成的,考慮到安全問題,簽名和驗簽最好在服務端完成,支付寶官方建議也是這樣的,所以php端需要把簽名好的參數傳給APP端。詳細步驟見正文:
一、 下載php支付寶sdk
https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.eCtVsf&treeId=54&articleId=103419&docType=1 (舊)
https://docs.open.alipay.com/54/103419/(新)
二、 查看支付寶App支付請求參數文檔,拼接請求參數,簽名
App支付請求參數說明
https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.wM4mV1&treeId=204&articleId=105465&docType=1(舊)
https://docs.open.alipay.com/204/105465/(新)
先是參數拼接生成簽名,再把前面的參數和簽名進行組裝。核心代碼如下:
require_once '/Alipay/aop/AopClient.php'; $private_path = "/Alipay/key/rsa_private_key.pem";//私鑰路徑 //構造業務請求參數的集合(訂單信息) $content = array(); $content['subject'] = "商品的標題/交易標題/訂單標題/訂單關鍵字等"; $content['out_trade_no'] = "商戶網站唯一訂單號"; $content['timeout_express'] = "該筆訂單允許的最晚付款時間"; $content['total_amount'] = "訂單總金額(必須定義成浮點型)"; $content['product_code'] = "QUICK_MSECURITY_PAY";/銷售產品碼,固定值 $con = json_encode($content);//$content是biz_content的值,將之轉化成json字符串
//公共參數 $Client = new \AopClient();//實例化支付寶sdk里面的AopClient類,下單時需要的操作,都在這個類里面 $param['app_id'] = '支付寶分配給開發者的應用ID'; $param['method'] = 'alipay.trade.app.pay';//接口名稱,固定值 $param['charset'] = 'utf-8';//請求使用的編碼格式 $param['sign_type'] = 'RSA2';//商戶生成簽名字符串所使用的簽名算法類型 $param['timestamp'] = date("Y-m-d Hi:i:s");//發送請求的時間 $param['version'] = '1.0';//調用的接口版本,固定為:1.0 $param['notify_url'] = '支付寶服務器異步回調地址'; $param['biz_content'] = $con;//業務請求參數的集合,長度不限,json格式,即前面一步得到的 $paramStr = $Client->getSignContent($param);//組裝請求簽名參數 $sign = $Client->alonersaSign($paramStr, $private_path, 'RSA2', true);//生成簽名 $param['sign'] = $sign; $str = $Client->getSignContentUrlencode($param);//最終請求參數
請求的說明,支付寶說的很清楚,這里再重新附上截圖:
三、驗簽
App 支付成功后會有返回字符串,客服端也需要判斷,這里不羅嗦,如下圖:
下一步就是在php服務端進行驗簽,支付寶異步會以post方式返回數據到異步回調地址:
function notify() { require_once('/alipay/aop/AopClient.php'); $aop = new \AopClient; //$public_path = "key/rsa_public_key.pem";//公鑰路徑 $aop->alipayrsaPublicKey = "支付寶公鑰"; //此處驗簽方式必須與下單時的簽名方式一致 $flag = $aop->rsaCheckV1($_POST, NULL, "RSA2"); //驗簽通過后再實現業務邏輯,比如修改訂單表中的支付狀態。 /** * ①驗簽通過后核實如下參數out_trade_no、total_amount、seller_id * ②修改訂單表 **/ //打印success,應答支付寶。必須保證本界面無錯誤。只打印了success,否則支付寶將重復請求回調地址。 echo 'success'; }
后記:
之前一直驗簽失敗,找了好久,終於解決了。文檔中說,驗簽用的是支付寶公鑰,並不是RSA2公鑰,這里需要特別注意,不要用錯了
請看截圖: