layout: post
支付宝支付php开发小技巧
subtitle: 支付宝支付php开发小技巧 date: 2020-10-13 author: BY header-img: img/post-bg-kuaidi.jpg catalog: true tags: - php - 支付宝支付
支付宝支付php开发小技巧
使用官方的sdk文件,以下是h5支付举例,文件基本上就是官方给的文件,然后某几个文件加一下命名空间即可
/**
* 支付宝h5支付页面值符串数据
* 文档: https://opendocs.alipay.com/open/203/105285 alipay.trade.wap.pay
* @return string 表单页面数据,请直接访问这个地址即可
*/
public function h5_pay($product_info = [])
{
if (empty($product_info['trade_sn'])) {
return false;
}
if (empty($product_info['total_fee'])) {
return false;
}
// 商户订单号,商户网站订单系统中唯一订单号,必填
$out_trade_no = $product_info['trade_sn'];
// 订单名称,必填
$subject = '支付';
// 付款金额,必填
$total_amount = $product_info['total_fee'];
// 商品描述,可空
if (empty($product_info['name'])) {
$product_info['name'] = '支付';
}
$body = $product_info['name'];
// 超时时间
$timeout_express = "1m";
$payRequestBuilder = new \app\pay\library\lib\AlipayTradeWapPayContentBuilder();
$payRequestBuilder->setBody($body);
$payRequestBuilder->setSubject($subject);
$payRequestBuilder->setOutTradeNo($out_trade_no);
$payRequestBuilder->setTotalAmount($total_amount);
$payRequestBuilder->setTimeExpress($timeout_express);
$result = false;
try {
$payResponse = new \app\pay\library\services\AlipayTradeService($this->h5config);
$result = $payResponse->wapPay($payRequestBuilder, $this->h5config['return_url'], $this->h5config['notify_url']);
} catch (\Exception $e) {
return false;
}
return $result;
}
这里是h5的异步验签
/**
* 支付宝h5异步通知验证
*
* @return string 返回给支付宝服务器的值符串
* @copyright 雪毅网络官方团队
* @author lxx
*/
public function h5_pay_notify_url()
{
try {
$arr = $_POST;
$result = false;
// 这个是官方sdk的services文件夹文件,这里只增加了命名空间
$alipaySevice = new \app\pay\library\services\AlipayTradeService($this->h5config);
db('error')->insert(['content' => 'h5_pay_notify_url data: ' . var_export($arr, true)]);
// ! 注意这里是一个小技巧,不然的化校验一直会失败(app支付也是一样的小技巧)
if (isset($arr['fund_bill_list'])) {
$arr['fund_bill_list'] = stripslashes($arr['fund_bill_list']); // 注意这里的是必须的,检测到php把这个字段增加了转义支付导致验证签名失败
}
$result = $alipaySevice->check($arr);
if (!empty($result)) {
// 校验签名成功
# 校验支付
$receive_data = $arr;
$return_data['trade_sn'] = $receive_data['out_trade_no'];
$return_data['total_fee'] = $receive_data['total_amount'];
$return_data['buyer_email'] = isset($receive_data['buyer_email']) ? $receive_data['buyer_email'] : '';
switch ($receive_data['trade_status']) {
case 'WAIT_BUYER_PAY':
$return_data['order_status'] = 1;
break;
case 'WAIT_SELLER_SEND_GOODS':
$return_data['order_status'] = 2;
break;
case 'WAIT_BUYER_CONFIRM_GOODS':
$return_data['order_status'] = 3;
break;
case 'TRADE_CLOSED':
$return_data['order_status'] = 4;
break;
case 'TRADE_FINISHED':
$return_data['order_status'] = 0;
break;
case 'TRADE_SUCCESS':
$return_data['order_status'] = 0;
break;
default:
$return_data['order_status'] = 5;
}
$this->pay_success($return_data);
echo "success";
} else {
// 校验签名失败
db('error')->insert(['content' => 'h5_pay_notify_url check sign fail ' . var_export($arr, true)]);
echo "fail";
}
die();
} catch (\Exception $e) {
$_err['code'] = $e->getCode();
$_err['file'] = $e->getFile();
$_err['line'] = $e->getLine();
$_err['msg'] = $e->getMessage();
$_err['trace'] = $e->getTrace();
db('error')->insert(['content' => 'h5_pay_notify_url Exception:' . var_export($_POST, true) . var_export($_err, true)]);
echo "fail";
die();
}
}