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 支付宝插件的引入 和调用的主要内容,如果未能解决你的问题,请参考以下文章

php thinkphp怎么集成支付宝接口

php支付宝在线交易时怎么实现的?

ThinkPHP整合支付宝担保交易

ThinkPHP5 支付宝支付扩展库(超简单,超好用~)

ThinkPHP5 支付宝支付扩展库(超简单,超好用~)

php编程之如何调用支付宝支付接口的实现