php 服務(wù)端集成支付寶APP支付實(shí)例
支付寶支付分為了很多種場(chǎng)景,這里只講述支付寶APP支付功能集成,期間遇到了特別大的坑,因此我簡(jiǎn)單描述下集成過(guò)程,并概述遇到的問(wèn)題及解決方案
由于公司業(yè)務(wù)簡(jiǎn)單,只支持支付寶支付,而無(wú)需關(guān)心退款,查詢(xún)等等額外功能,因此該篇內(nèi)容僅僅講述支付寶支付接口時(shí)服務(wù)端如何準(zhǔn)備APP拉取支付訂單的信息,大概流程如下
一、創(chuàng)建應(yīng)用及配置
首先,需要到螞蟻金服開(kāi)發(fā)平臺(tái)(open.alipay.com)注冊(cè)應(yīng)用,并獲取應(yīng)用ID,并配置應(yīng)用,這里在配置時(shí)主要是簽約,生成應(yīng)用的RSA2公私鑰,同時(shí)獲取到支付寶提供的支付公鑰等,這部分官網(wǎng)后臺(tái)都有提示,比較簡(jiǎn)單
二、下載對(duì)應(yīng)SDK
這里我是在PHP后臺(tái)集成服務(wù),因此下載的是PHP SDK,地址:https://docs.open.alipay.com/54/103419/
三、準(zhǔn)備一個(gè)可以訪問(wèn)的真實(shí)域名
四、案例
當(dāng)以上三部完成之后,此時(shí)就可以進(jìn)入配置我們自己的業(yè)務(wù)代碼了
4.1、組織APP支付時(shí)的支付訂單信息
<?php
require_once (__DIR__.'/alipay-sdk-PHP-20171023143822/AopSdk.php');
class Alipay
{
/**
* 應(yīng)用ID
*/
const APPID = '你的應(yīng)用ID';
/**
*請(qǐng)?zhí)顚?xiě)開(kāi)發(fā)者私鑰去頭去尾去回車(chē),一行字符串
*/
const RSA_PRIVATE_KEY = '應(yīng)用對(duì)應(yīng)開(kāi)發(fā)者私鑰';
/**
*請(qǐng)?zhí)顚?xiě)支付寶公鑰,一行字符串
*/
const ALIPAY_RSA_PUBLIC_KEY = '支付寶提供的公鑰';
/**
* 支付寶服務(wù)器主動(dòng)通知商戶(hù)服務(wù)器里指定的頁(yè)面
* @var string
*/
private $callback = "http://www.test.com/notify/alipay_notify.php";
/**
*生成APP支付訂單信息
* @param string $orderId 商品訂單ID
* @param string $subject 支付商品的標(biāo)題
* @param string $body 支付商品描述
* @param float $pre_price 商品總支付金額
* @param int $expire 支付交易時(shí)間
* @return bool|string 返回支付寶簽名后訂單信息,否則返回false
*/
public function unifiedorder($orderId, $subject,$body,$pre_price,$expire){
try{
$aop = new \AopClient();
$aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
$aop->appId = self::APPID;
$aop->rsaPrivateKey = self::RSA_PRIVATE_KEY;
$aop->format = "json";
$aop->charset = "UTF-8";
$aop->signType = "RSA2";
$aop->alipayrsaPublicKey = self::ALIPAY_RSA_PUBLIC_KEY;
//實(shí)例化具體API對(duì)應(yīng)的request類(lèi),類(lèi)名稱(chēng)和接口名稱(chēng)對(duì)應(yīng),當(dāng)前調(diào)用接口名稱(chēng):alipay.trade.app.pay
$request = new \AlipayTradeAppPayRequest();
//SDK已經(jīng)封裝掉了公共參數(shù),這里只需要傳入業(yè)務(wù)參數(shù)
$bizcontent = "{\"body\":\"{$body}\"," //支付商品描述
. "\"subject\":\"{$subject}\"," //支付商品的標(biāo)題
. "\"out_trade_no\":\"{$orderId}\"," //商戶(hù)網(wǎng)站唯一訂單號(hào)
. "\"timeout_express\":\"{$expire}m\"," //該筆訂單允許的最晚付款時(shí)間,逾期將關(guān)閉交易
. "\"total_amount\":\"{$pre_price}\"," //訂單總金額,單位為元,精確到小數(shù)點(diǎn)后兩位,取值范圍[0.01,100000000]
. "\"product_code\":\"QUICK_MSECURITY_PAY\""
. "}";
$request->setNotifyUrl($this->callback);
$request->setBizContent($bizcontent);
//這里和普通的接口調(diào)用不同,使用的是sdkExecute
$response = $aop->sdkExecute($request);
//htmlspecialchars是為了輸出到頁(yè)面時(shí)防止被瀏覽器將關(guān)鍵參數(shù)html轉(zhuǎn)義,實(shí)際打印到日志以及http傳輸不會(huì)有這個(gè)問(wèn)題
return htmlspecialchars($response);//就是orderString 可以直接給客戶(hù)端請(qǐng)求,無(wú)需再做處理。
}catch (\Exception $e){
return false;
}
}
}
4.2、支付寶支付成功之后異步回調(diào)處理
<?php
/**
* alipay_notify.php.
* User: lvfk
* Date: 2017/10/26 0026
* Time: 13:48
* Desc: 支付寶支付成功異步通知
*/
include_once (__DIR__.'/../alipay-sdk-PHP-20171023143822/AopSdk.php');
//驗(yàn)證簽名
$aop = new \AopClient();
$aop->alipayrsaPublicKey = \Comm\Pay\Alipay::ALIPAY_RSA_PUBLIC_KEY;
$flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");
//驗(yàn)簽
if($flag){
//處理業(yè)務(wù),并從$_POST中提取需要的參數(shù)內(nèi)容
if($_POST['trade_status'] == 'TRADE_SUCCESS'
|| $_POST['trade_status'] == 'TRADE_FINISHED'){//處理交易完成或者支付成功的通知
//獲取訂單號(hào)
$orderId = $_POST['out_trade_no'];
//交易號(hào)
$trade_no = $_POST['trade_no'];
//訂單支付時(shí)間
$gmt_payment = $_POST['gmt_payment'];
//轉(zhuǎn)換為時(shí)間戳
$gtime = strtotime($gmt_payment);
//此處編寫(xiě)回調(diào)處理邏輯
//處理成功一定要返回 success 這7個(gè)字符組成的字符串,
//die('success');//響應(yīng)success表示業(yè)務(wù)處理成功,告知支付寶無(wú)需在異步通知
}
}
五、遇到的問(wèn)題
5.1、一直報(bào)錯(cuò)40001=>isv.invalid-signature
為了搞清楚原因,先后多次重新生成應(yīng)用的RSA2公私密鑰,發(fā)現(xiàn)都沒(méi)有作用。最后結(jié)合網(wǎng)上資料,才發(fā)現(xiàn),原來(lái)是支付寶回調(diào)地址notifyUrl不能有 '?' 以及 ?后面加參數(shù)
5.2、支付寶異步通知成功了,但是$_POST為空
這個(gè)也花費(fèi)了一點(diǎn)時(shí)間查找,開(kāi)始做的時(shí)候就是遵照支付寶的建議使用HTTS方式請(qǐng)求。但這樣應(yīng)用后臺(tái)一直通知沒(méi)有參數(shù)內(nèi)容。最后才想起來(lái)由于我們的應(yīng)用使用了HTTS雙向認(rèn)證,這個(gè)原因?qū)е轮Ц秾毜姆?wù)器回調(diào)的參數(shù)為空。最后,把回調(diào)地址改為了HTTP方式,驗(yàn)證通過(guò)
通過(guò)遇到的問(wèn)題,首先查看支付寶的文檔描述以及支付寶提供的錯(cuò)誤碼解釋?zhuān)瑢?shí)在不行就百度或者谷歌,再加上自己不斷測(cè)試驗(yàn)證,最終一定可以解決問(wèn)題
至此,支付寶APP支付這塊功能完成,其他的APP退款、對(duì)賬單等等功能就沒(méi)繼續(xù)做,不過(guò)按照支付寶官網(wǎng)文檔以及支付寶提供的SDK,集成到自己應(yīng)用也只是時(shí)間問(wèn)題。
以上這篇php 服務(wù)端集成支付寶APP支付實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Yii框架參數(shù)化查詢(xún)中IN查詢(xún)只能查詢(xún)一個(gè)的解決方法
這篇文章主要介紹了Yii框架參數(shù)化查詢(xún)中IN查詢(xún)只能查詢(xún)一個(gè)的解決方法,結(jié)合實(shí)例形式分析了Yii框架中IN查詢(xún)只能查一個(gè)的原因及FIND_IN_SET函數(shù)相關(guān)功能與使用技巧,需要的朋友可以參考下2017-05-05
Laravel登錄失敗次數(shù)限制的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于Laravel登錄失敗次數(shù)限制的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
PHP隨機(jī)生成18位不重復(fù)的訂單號(hào)代碼實(shí)例
這篇文章主要介紹了PHP隨機(jī)生成18位不重復(fù)的訂單號(hào)代碼實(shí)例,代碼很簡(jiǎn)單但是很實(shí)用,有需要的同學(xué)可以參考下2021-03-03
WordPress中用于更新偽靜態(tài)規(guī)則的PHP代碼實(shí)例講解
這篇文章主要介紹了WordPress中用于更新偽靜態(tài)規(guī)則的PHP代碼實(shí)例講解,圍繞flush_rewrite_rules()函數(shù)的使用展開(kāi)來(lái)講,需要的朋友可以參考下2015-12-12
修改destoon會(huì)員公司的偽靜態(tài)中的com目錄的方法
這篇文章主要介紹了修改destoon會(huì)員公司的偽靜態(tài)中的com目錄的方法,在偽靜態(tài)設(shè)置中很實(shí)用的技巧,需要的朋友可以參考下2014-08-08
eWebEditor v3.8 商業(yè)完整版 (PHP)
eWebEditor v3.8 商業(yè)完整版 (PHP)...2006-12-12
Laravel框架FormRequest中重寫(xiě)錯(cuò)誤處理的方法
這篇文章主要介紹了Laravel框架FormRequest中重寫(xiě)錯(cuò)誤處理的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02

