本文版权归本宝宝所有 未得允许不得转载

下载地址传送门 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

//合作身份者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文件中

 'ALIPAY_CONFIG' => array(
'partner' => '',  //身份信息 (必填)
'seller_id' => '',  //id (必填)
'key' => '',      //key值(必填)
'notify_url' => '', //必须是外网可以访问到的地址
'return_url' => '',  //支付宝返回后的同步跳转地址
'sign_type' => strtoupper('MD5'),  
'input_charset' => strtolower('utf-8'),
'transport' => 'http',
'cacert' => VENDOR_PATH.'Alipay/cacert.pem',
'payment_type' => '1',
'service' => 'create_direct_pay_by_user',
'anti_phishing_key' => '',  //钓鱼 可以不填写
'exter_invoke_ip' => '',    //可以不填写
),

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 根据返回结果信息做相应的更改  创建一个控制器

①支付宝返回同步地址的体现

 private $_config;
private $_notifyObj;
function _initialize(){
vendor('Alipay/lib/alipay_notify','','.class.php');
$this->_config = C('ALIPAY_CONFIG');
$this->_notifyObj = new \AlipayNotify($this->_config);
}
//同步的通知地址
public function returnUrl()
{
$checkResult = $this->_notifyObj->verifyReturn();
if ($checkResult) {
if ($_GET['is_success'] == "T" && $_GET['trade_status'] == "TRADE_SUCCESS") {
$this->success('对订单'.$_GET['out_trade_no'].'支付成功',U('User/index'));
return;
}else{
$this->error('支付失败,请进订单中心查看!');
return;
}
}else{
$this->error('支付通知验证失败,请联系管理员!');
return;
}
}

②异步地址的修改 ps:必须在外网才能够生效 成功 后必须echo "success" 这个字符串 否则支付宝监听不到 会在24小时20分钟一直提醒

  //异步的通知地址
public function notifyUrl()
{
$checkResult = $this->_notifyObj->verifyNotify();
if ($checkResult) {
$tradeStatus = $_POST['trade_status'];
$outTradeNo = $_POST['out_trade_no'];
$tradeNo = $_POST['trade_no'];
if ($tradeStatus == "TRADE_SUCCESS") {
$orderData = D('Order')->where(array('order_no'=>$outTradeNo))->find();
if (empty($orderData)) {
M('log')->add(array(
'ser_type' => 1,
'code' => 'ORDER_EXC',
'ser_data' => serialize(array('order_no'=>$outTradeNo,'trade_no'=>$tradeNo)),
'create_time'=>NOW_TIME,
));
exit;
} if ($orderData['status'] != 0) {
M('log')->add(array(
'ser_type' => 2,
'code' => 'ORDER_EXC',
'ser_data' => serialize(array('order_no'=>$outTradeNo,'trade_no'=>$tradeNo))
));
exit;
} D('Order')->where(array('order_no'=>$outTradeNo))->save(array('status'=>1)); echo "success";
}else{
D('Order')->where(array('order_no'=>$outTradeNo))->save(array('status'=>2));
}
}else{
echo "fail";
} }

最新文章

  1. 02- Shell脚本学习--运算符
  2. iOS----ARC(自动内存管理)
  3. Ztree的简单使用和后台交互的写法(一)
  4. hdu 5445 Food Problem 多重背包
  5. C#解leetcode 11. Container With Most Water
  6. HDU 2104 hide handkerchief
  7. PHP静态延迟绑定简单示例
  8. Python之文件与目录操作及压缩模块(os、shutil、zipfile、tarfile)
  9. c#读取Excel数据到Gridview
  10. React Native小白入门学习路径——二
  11. 3 week work—Grid Layout
  12. [国家集训队]middle
  13. NetMQ 消息队列
  14. mongodb节点配置指南
  15. hihocoder 1580 dp最大子矩阵和
  16. 记数排序 & 桶排序 & 基数排序
  17. tp 查询数据库时报错 A non well formed numeric value encountered
  18. Java集合类初始容量、加载因子、扩容增量
  19. [BZOJ2717]迷路的兔子[构造]
  20. python3 提取http请求response中的某个值

热门文章

  1. js执行上下文和执行栈
  2. 5 - ByteBuf-替换ByteBuffer-字节操作
  3. Spring Cloud下使用Feign Form实现微服务之间的文件上传
  4. ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第九天(非原创)
  5. springBoot jpa uuid生成策略
  6. 红象云腾CRH 一键部署大数据平台
  7. Unity结合Flask实现排行榜功能
  8. IOS 九宫图解锁(封装)
  9. World Wind Java开发之一(转)
  10. UVA 1642 Magical GCD(gcd的性质,递推)