本文版權歸本寶寶所有 未得允許不得轉載
下載地址傳送門 https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.twLYka&treeId=62&articleId=103566&docType=1
1 文件 demo 的下載 后 選擇 md5版本或者是RDA版本 我這兒選擇MD5版本 php utf8 版本 更改一下 文件名
2 文件的放入 在 Thinkphp/library/vendor
二 : 關鍵點技術分析
1 配置參數的 分析 於講解
找到alipay.config.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
//合作身份者ID,簽約賬號,以2088開頭由16位純數字組成的字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
$alipay_config
[
'partner'
] =
''
;
//收款支付寶賬號,以2088開頭由16位純數字組成的字符串,一般情況下收款賬號就是簽約賬號
$alipay_config
[
'seller_id'
] =
$alipay_config
[
'partner'
];
// MD5密鑰,安全檢驗碼,由數字和字母組成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
$alipay_config
[
'key'
] =
''
;
// 服務器異步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問
$alipay_config
[
'notify_url'
] =
"http://商戶網址/create_direct_pay_by_user-PHP-UTF-8/notify_url.php"
;
// 頁面跳轉同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問
$alipay_config
[
'return_url'
] =
"http://商戶網址/create_direct_pay_by_user-PHP-UTF-8/return_url.php"
;
//簽名方式
$alipay_config
[
'sign_type'
] =
strtoupper
(
'MD5'
);
//字符編碼格式 目前支持 gbk 或 utf-8
$alipay_config
[
'input_charset'
]=
strtolower
(
'utf-8'
);
//ca證書路徑地址,用於curl中ssl校驗
//請保證cacert.pem文件在當前文件夾目錄中
$alipay_config
[
'cacert'
] =
getcwd
().
'\\cacert.pem'
;
//訪問模式,根據自己的服務器是否支持ssl訪問,若支持請選擇https;若不支持請選擇http
$alipay_config
[
'transport'
] =
'http'
;
// 支付類型 ,無需修改
$alipay_config
[
'payment_type'
] =
"1"
;
// 產品類型,無需修改
$alipay_config
[
'service'
] =
"create_direct_pay_by_user"
;
|
通過 查看 這些 基本配置參數 我們 可以將參數 配置到config.php文件中
1 'ALIPAY_CONFIG' => array( 2 'partner' => '', //身份信息 (必填) 3 'seller_id' => '', //id (必填) 4 'key' => '', //key值(必填) 5 'notify_url' => '', //必須是外網可以訪問到的地址 6 'return_url' => '', //支付寶返回后的同步跳轉地址 7 'sign_type' => strtoupper('MD5'), 8 'input_charset' => strtolower('utf-8'), 9 'transport' => 'http', 10 'cacert' => VENDOR_PATH.'Alipay/cacert.pem', 11 'payment_type' => '1', 12 'service' => 'create_direct_pay_by_user', 13 'anti_phishing_key' => '', //釣魚 可以不填寫 14 'exter_invoke_ip' => '', //可以不填寫 15 ),
2 php方法的寫入 可以放入 function 中方便我們的使用
function subPayment($tradeNo, $amount, $subject, $body="") { $alipayConfig = C('ALIPAY_CONFIG'); //發起請求時的參數 $requestParam = $alipayConfig; $requestParam['out_trade_no'] = $tradeNo; $requestParam['subject'] = $subject; $requestParam['total_fee'] = $amount; $requestParam['body'] = $body; $requestParam['_input_charset'] = trim(strtolower($alipayConfig['input_charset'])); vendor('Alipay/lib/alipay_submit','','.class.php'); $alipaySubmitObj = new \AlipaySubmit($alipayConfig); $htmlText = $alipaySubmitObj->buildRequestForm($requestParam, "get", "確定"); echo $htmlText; }
3內部控制器的調用
subPayment($orderData['order_no'], $orderData['amount'], NOW_TIME.'支付測試', NOW_TIME.'支付描述'); //參數1 生成 唯一的編號 參數2 金額 參數3: 支付的subject 參數 4 支付描述信息
4 根據返回結果信息做相應的更改 創建一個控制器
①支付寶返回同步地址的體現
1 private $_config; 2 private $_notifyObj; 3 function _initialize(){ 4 vendor('Alipay/lib/alipay_notify','','.class.php'); 5 $this->_config = C('ALIPAY_CONFIG'); 6 $this->_notifyObj = new \AlipayNotify($this->_config); 7 } 8 //同步的通知地址 9 public function returnUrl() 10 { 11 $checkResult = $this->_notifyObj->verifyReturn(); 12 if ($checkResult) { 13 if ($_GET['is_success'] == "T" && $_GET['trade_status'] == "TRADE_SUCCESS") { 14 $this->success('對訂單'.$_GET['out_trade_no'].'支付成功',U('User/index')); 15 return; 16 }else{ 17 $this->error('支付失敗,請進訂單中心查看!'); 18 return; 19 } 20 }else{ 21 $this->error('支付通知驗證失敗,請聯系管理員!'); 22 return; 23 } 24 }
②異步地址的修改 ps:必須在外網才能夠生效 成功 后必須echo "success" 這個字符串 否則支付寶監聽不到 會在24小時20分鍾一直提醒
1 //異步的通知地址 2 public function notifyUrl() 3 { 4 $checkResult = $this->_notifyObj->verifyNotify(); 5 if ($checkResult) { 6 $tradeStatus = $_POST['trade_status']; 7 $outTradeNo = $_POST['out_trade_no']; 8 $tradeNo = $_POST['trade_no']; 9 if ($tradeStatus == "TRADE_SUCCESS") { 10 $orderData = D('Order')->where(array('order_no'=>$outTradeNo))->find(); 11 if (empty($orderData)) { 12 M('log')->add(array( 13 'ser_type' => 1, 14 'code' => 'ORDER_EXC', 15 'ser_data' => serialize(array('order_no'=>$outTradeNo,'trade_no'=>$tradeNo)), 16 'create_time'=>NOW_TIME, 17 )); 18 exit; 19 } 20 21 if ($orderData['status'] != 0) { 22 M('log')->add(array( 23 'ser_type' => 2, 24 'code' => 'ORDER_EXC', 25 'ser_data' => serialize(array('order_no'=>$outTradeNo,'trade_no'=>$tradeNo)) 26 )); 27 exit; 28 } 29 30 D('Order')->where(array('order_no'=>$outTradeNo))->save(array('status'=>1)); 31 32 echo "success"; 33 }else{ 34 D('Order')->where(array('order_no'=>$outTradeNo))->save(array('status'=>2)); 35 } 36 }else{ 37 echo "fail"; 38 } 39 40 }