本文版权归本宝宝所有 未得允许不得转载
下载地址传送门 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 }
原文:http://www.cnblogs.com/sanqiyi/p/6657236.html