tp5(fastadmin)对接苹果支付
蘋果支付的流程:
1、前端在調起蘋果支付前,先請求到服務端,服務端先生成一條充值記錄,但是狀態為:未支付;然后把這個訂單id發給前端。
2、前端在支付完成的時候,會收到蘋果的支付憑證,將此憑證和訂單id回傳給服務端。訂單id的作用是用來確定是哪一筆。支付憑證是拿來校驗是否支付成功。檢驗成功后,自己的業務邏輯(將該條訂單的狀態改為已支付,然后加余額或延長會員時間)
在這我也說一下我前端遇到的一個問題,方便有遇到的,可以參考。
直接編譯到蘋果手機上,會一直發起失敗。我們這邊的解決方法是,打包出來,然后發到蘋果的【TestFlight】上,然后就可以正常發起了。
而且這時候發起的支付,可以無限支付,因為是沙盒環境,不會扣費
后端在蘋果支付的過程中,只需要做兩步操作:
第一步:生成一條充值記錄,但是狀態為:未支付
第二部:接收到前端的支付憑證后,校驗支付憑證,然后業務邏輯
以下是蘋果支付的驗證。(創建訂單的接口,不用特殊處理,只要生成一條未支付的訂單記錄就行(直接insert一條記錄)。這里就不貼代碼了)
<?php
namespace appapicontroller;
use appcommoncontrollerApi;
class Applepay extends Api
{
protected $noNeedLogin = [];
protected $noNeedRight = '*';
protected $orderNum = null;
protected $model = null;
protected $relationSearch = true;
protected $appleCode = [
21000 => 'App Store無法讀取你提供的JSON數據',
21002 => '收據數據不符合格式',
21003 => '收據無法被驗證',
21004 => '你提供的共享密鑰和賬戶的共享密鑰不一致',
21005 => '收據服務器當前不可用',
21006 => '收據是有效的,但訂閱服務已經過期。當收到這個信息時,解碼后的收據信息也包含在返回內容中',
21007 => '收據信息是測試用(sandbox),但卻被發送到產品環境中驗證',
21008 => '收據信息是產品環境中使用,但卻被發送到測試環境中驗證'
];
public function _initialize()
{
parent::_initialize();
$this->model = model('app\common\model\activity\Order');
}
/**
* @title 驗證支付票據 完成訂單接口
*/
public function verifyReceipt()
{
$receipt = $this->request->param('receipt/s', '');
if (empty($receipt)) {
$this->error('訂單錯誤');
}
$this->orderNum = $this->request->param('order_id/s', '');
$order = $this->model->where(array('order_id' => $this->orderNum))->find();
if (empty($order)) {
$this->error('訂單錯誤');
}
if ($order['state'] == 1) {
$this->error('訂單已成功支付,請確認');
}
$time = time();
file_put_contents("notifyLog/notifyProcessLog".date("Ymd", $time).".log", "
" . date("Y-m-d H:i:s", $time) . ",支付憑證:" . $receipt, FILE_APPEND);
$jsonItem = json_encode(['receipt-data' => $receipt]);
$url = 'https://buy.itunes.apple.com/verifyReceipt'; //正式
//模擬post提交(下面會貼出來),將前端獲取到的憑證,去和蘋果換取詳細的支付信息
$result = $this->http_post_json($jsonItem, $url);
if ($result['status'] == '21007') {
//驗證失敗 返回app錯誤狀態
$url = 'https://sandbox.itunes.apple.com/verifyReceipt'; //測試
$result = $this->http_post_json($jsonItem, $url);
}
file_put_contents("notifyLog/notifyProcessLog".date("Ymd", $time).".log", "
" . date("Y-m-d H:i:s", $time) . ",order:" . var_export($result, true), FILE_APPEND);
//如果檢測到 等于 0 就是支付成功,其他的錯誤碼去獲取對應錯誤信息
if ($result['status'] !== 0) {
//驗證失敗 返回app錯誤狀態
$this->error($this->appleCode[$result['status']]);
}
//接下來就是做自己的業務邏輯
$this->success('充值成功');
}
//模擬post提交
public function http_post_json($json, $url)
{
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); //這兩行一定要加,不加會報SSL 錯誤
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
$response = curl_exec($ch);
$errno = curl_errno($ch);
$errmsg = curl_error($ch);
curl_close($ch);
$data = json_decode($response, true);
return $data;
}
}
自己親測可用。驗證的步驟做的不夠詳細,可以自己根據邏輯詳細做驗證。
因為我只需要知道是否支付成功就行,所以我這只驗證了前端傳過來的支付成功的憑證是否正確且已正常支付,然后根據訂單id定位哪條記錄,就可以找到用戶和金額。
(可根據自己的情況,加 product_id(蘋果虛擬產品的id)的驗證或其他的一些驗證,此不再贅述)
!!!是的,你不用懷疑,就是這么簡單~~~
總結
以上是生活随笔為你收集整理的tp5(fastadmin)对接苹果支付的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 受裁员影响,微软将于 3 月 10 日关
- 下一篇: 椭圆曲线密码算法--点乘点加运算