用tp5.0框架 写一个简单的支付
时间: 2023-05-28 11:01:34 浏览: 131
php实现的支付宝网页支付功能示例【基于TP5框架】
我作为AI语言模型,无法编写、运行和测试完整的代码,以下提供一个TP5.0框架下集成支付宝支付的样例代码,供参考:
// 公共方法
// 加载composer自动加载器
require __DIR__ . '/vendor/autoload.php';
// 导入需要使用的类
use think\facade\Config;
use think\facade\Log;
use think\facade\Request;
use think\Db;
/**
* 发起支付宝支付
*
* @param float $totalFee 支付金额
* @param string $outTradeNo 商户订单号
* @param string $body 商品描述
* @return string 支付宝支付页面
*/
function aliPay($totalFee, $outTradeNo, $body)
{
// 支付宝必要参数
$config = Config::get('payment.ali_pay');
$appId = $config['app_id'];
$merchantPrivateKey = $config['merchant_private_key'];
$alipayPublicKey = $config['alipay_public_key'];
$gatewayUrl = $config['gateway_url'];
$charset = $config['charset'];
$signType = $config['sign_type'];
// 拼接支付宝请求参数
$bizContent = [
'body' => $body,
'subject' => $body,
'out_trade_no' => $outTradeNo,
'total_amount' => $totalFee,
'product_code' => 'QUICK_WAP_WAY',
];
$params = [
'app_id' => $appId,
'method' => 'alipay.trade.wap.pay',
'format' => 'JSON',
'charset' => $charset,
'sign_type' => $signType,
'timestamp' => date('Y-m-d H:i:s'),
'version' => '1.0',
'notify_url' => 'http://example.com/api/pay/notify', // 支付宝异步通知地址
'return_url' => 'http://example.com/order/success', // 支付宝同步通知地址
'biz_content' => json_encode($bizContent),
];
// 对支付宝请求参数进行签名
$params['sign'] = generateSign($params, $merchantPrivateKey, $signType);
// 跳转至支付宝支付页面
$url = $gatewayUrl . '?' . http_build_query($params);
return redirect($url);
}
/**
* 生成支付宝参数签名
*
* @param array $params 请求参数
* @param string $merchantPrivateKey 商户私钥
* @param string $signType 签名类型
* @return string 签名结果
*/
function generateSign($params, $merchantPrivateKey, $signType = 'RSA2')
{
// 排序请求参数
ksort($params);
// 拼接请求参数
$paramStr = '';
foreach ($params as $key => $value) {
$paramStr .= $key . '=' . $value . '&';
}
$paramStr = rtrim($paramStr, '&');
// 生成签名
$rsa = new \phpseclib\Crypt\RSA();
$rsa->setPrivateKeyFormat(\phpseclib\Crypt\RSA::PRIVATE_FORMAT_PKCS1);
$rsa->setPublicKeyFormat(\phpseclib\Crypt\RSA::PUBLIC_FORMAT_PKCS1);
$rsa->loadKey($merchantPrivateKey);
$sign = $rsa->sign($paramStr, $signType == 'RSA2' ? \phpseclib\Crypt\RSA::SIGNATURE_SHA256 : \phpseclib\Crypt\RSA::SIGNATURE_SHA1);
$sign = base64_encode($sign);
return $sign;
}
/**
* 支付宝支付异步通知处理方法
*
* @param array $data 异步通知数据
* @param float $totalFee 实际支付金额
* @return bool 是否处理成功
*/
function aliPayNotify($data, $totalFee)
{
// 验证异步通知签名
$config = Config::get('payment.ali_pay');
$alipayPublicKey = $config['alipay_public_key'];
$signType = $config['sign_type'];
$result = verifySign($data, $alipayPublicKey, $signType);
if (!$result) {
return false;
}
// 验证商户订单号和支付宝交易号是否已处理
$outTradeNo = $data['out_trade_no'];
$tradeNo = $data['trade_no'];
$orderInfo = Db::name('orders')->where('out_trade_no', $outTradeNo)->field('id,payment_status,transaction_id')->find();
if (!$orderInfo || $orderInfo['transaction_id']) {
return false;
}
// 修改订单状态并保存交易号
Db::name('orders')->where('id', $orderInfo['id'])->update([
'payment_status' => 1,
'transaction_id' => $tradeNo,
'payment_time' => time(), // 可选,记录支付时间
]);
// 处理完成,返回true结束回调
return true;
}
/**
* 验证支付宝异步通知签名
*
* @param array $data 异步通知数据
* @param string $alipayPublicKey 支付宝公钥
* @param string $signType 签名类型
* @return bool 是否验证通过
*/
function verifySign($data, $alipayPublicKey, $signType = 'RSA2')
{
// 获取通知参数中的签名字符串
$sign = $data['sign'];
unset($data['sign'], $data['sign_type']);
// 排序请求参数
ksort($data);
// 拼接请求参数
$paramStr = '';
foreach ($data as $key => $value) {
$paramStr .= $key . '=' . $value . '&';
}
$paramStr = rtrim($paramStr, '&');
// 验证签名
$rsa = new \phpseclib\Crypt\RSA();
$rsa->setPrivateKeyFormat(\phpseclib\Crypt\RSA::PRIVATE_FORMAT_PKCS1);
$rsa->setPublicKeyFormat(\phpseclib\Crypt\RSA::PUBLIC_FORMAT_PKCS1);
$rsa->loadKey($alipayPublicKey);
$result = $rsa->verify($paramStr, base64_decode($sign), $signType == 'RSA2' ? \phpseclib\Crypt\RSA::SIGNATURE_SHA256 : \phpseclib\Crypt\RSA::SIGNATURE_SHA1);
return $result;
}
// 使用样例
$totalFee = 0.01; // 支付金额
$outTradeNo = '202205271331482050'; // 商户订单号
$body = '测试商品'; // 商品描述
$payUrl = aliPay($totalFee, $outTradeNo, $body); // 获取支付页面链接
// 支付宝支付异步通知处理方法
$data = Request::param(); // 异步通知数据
$totalFee = 0.01; // 实际支付金额
$notifyResult = aliPayNotify($data, $totalFee); // 处理支付结果
阅读全文