Thinkphp 支付宝插件的引入 和调用
Posted 三七、
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Thinkphp 支付宝插件的引入 和调用相关的知识,希望对你有一定的参考价值。
本文版权归本宝宝所有 未得允许不得转载
下载地址传送门 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 }
以上是关于Thinkphp 支付宝插件的引入 和调用的主要内容,如果未能解决你的问题,请参考以下文章