本文主要介绍通过thinkPHP5和第三方支付类包(WeChatDeveloper)实现快速接入支付宝网站支付和手机网站支付(自动拉起支付宝APP),以及如何进行订单回调、如何判断手机和PC端、如果进行订单退款等,整理了部分在开发中经常遇到的错误和难踩的坑!
GIT库地址:https://gitee.com/zoujingli/WeChatDeveloper
官方文档地址:https://www.kancloud.cn/zoujingli/wechat-developer
# 首次安装 线上版本(稳定)
composer require zoujingli/wechat-developer
# 首次安装 开发版本
composer require zoujingli/wechat-developer dev-master
# 更新 WeChatDeveloper
composer update zoujingli/wechat-developer
1、支付宝配置参数如何获取请移步文章 “PHP接入支付宝支付接口,支付宝公钥、应用私钥、APPID和产品申请指南” 有详细的获取教程,记得开通对应产品;
2、复制以下代码前必须安装WeChatDeveloper类,下面都是基于这个类写的,如果不安装不用在往下看了;
3、支付宝支持沙箱模式,可以先使用沙箱进行测试开发,非常好用;
4、下面代码部分已经用xxx代码,需要替换成自己业务对应的才可以,验证是否手机端的方法已经在 “php接入微信支付,扫码支付和H5支付(非微信浏览器),基于thinkPHP框架 WeChatDeveloper支付类包 踩坑指南” 文章中写了,需要的可以去拿;
5、在支付成功回调的过程中,支付宝回进行多次回调,记得加验证!!
/**
* 支付宝支付
*/
public function aliPay(){
// 准备配置参数
$config = [
// 沙箱模式
'debug' => false,
// 签名类型(RSA|RSA2)
'sign_type' => "RSA2",
// 应用ID
'appid' => '20161xxxxxxxx088',
// 支付宝公钥 (1行填写,特别注意:这里是支付宝公钥,不是应用公钥,最好从开发者中心的网页上去复制)
'public_key' => '公钥',
// 支付宝私钥 (1行填写)
'private_key' => '私钥'
];
// 异步通知地址和支付成功后的同步跳转
$config['notify_url'] = 'http://www.baidu.com/aliCallback';
$config['return_url'] = 'http://www.baidu.com/complete';
try {
// 实例支付对象,判断是手机端还是PC端
if(is_wap()){
$pay = \AliPay\Wap::instance($config);
}else{
$pay = \AliPay\Web::instance($config);
}
// 传入参数
$result = $pay->apply([
'out_trade_no' => time(), // 商户订单号
'total_amount' => 1, // 支付金额,单位是元
'subject' => '商品购买', // 支付订单描述
]);
echo $result;
} catch (\WeChat\Exceptions\InvalidResponseException $e) {
echo $e->getMessage();
}
}
/**
* 支付宝订单回调
*/
public function aliCallback(){
// 准备配置参数
$config = [
// 沙箱模式
'debug' => false,
// 签名类型(RSA|RSA2)
'sign_type' => "RSA2",
// 应用ID
'appid' => '20161xxxxxxxx088',
// 支付宝公钥 (1行填写,特别注意:这里是支付宝公钥,不是应用公钥,最好从开发者中心的网页上去复制)
'public_key' => '公钥',
// 支付宝私钥 (1行填写)
'private_key' => '私钥'
];
// 实例化类
$alipay = new \AliPay\Web($config);
// 获取通知数据,括号里不能加true
$data = $alipay->notify();
if($data['trade_status']!='TRADE_SUCCESS'){
Log::record("订单发生了错误","订单错误");
exit;
}
// 根据订单号修改订单状态
// 注意这里要对订单状态作为条件,支付宝会进行多次回调
Order::update(['status'=>"2"],['ticket_id'=>$data['out_trade_no'],'status'=>1]);
}
/**
* 支付宝退款
*/
public function aliRefund(){
// 准备配置参数
$config = [
// 沙箱模式
'debug' => false,
// 签名类型(RSA|RSA2)
'sign_type' => "RSA2",
// 应用ID
'appid' => '20161xxxxxxxx088',
// 支付宝公钥 (1行填写,特别注意:这里是支付宝公钥,不是应用公钥,最好从开发者中心的网页上去复制)
'public_key' => '公钥',
// 支付宝私钥 (1行填写)
'private_key' => '私钥'
];
try {
$pay = \AliPay\App::instance($config);
$result = $pay->refund('订单号', '退款金额');
// 更改数据库状态
Order::update(['status'=>"-2"],['order_sn'=>'订单号']);
return success_json('','退款成功');
} catch (\WeChat\Exceptions\InvalidResponseException $e) {
return error_json('退款失败:'.$e->getMessage());
}
}
文章:php接入微信支付,扫码支付和H5支付(非微信浏览器),基于thinkPHP框架 WeChatDeveloper支付类包 踩坑指南