本文版權歸本寶寶所有 未得允許不得轉載
下載地址傳送門 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 }

