food_server/FlyCube/Api/Controller/PayController.class.php
sszdot 854fe2c3fc 【类 型】:factor
【原  因】:
【过  程】:提交支付订单 仅商品价格 改为商品价格+打包费+运费
【影  响】:
2024-12-17 12:01:44 +08:00

136 lines
5.8 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace Api\Controller;
use Yansongda\Pay\Pay;
class PayController extends PublicController
{
/**
* @description: 子类的初始化
*/
public function _initialize()
{
//初始化 pay类的参数
$this->config = [
'wechat' => [
'default' => [
'mch_id' => C('weixin')['mch_id'], // 必填-商户号
'mch_secret_key' => C('weixin')['mch_secret_key'], // 必填-v3商户秘钥
'mch_secret_cert' => C('weixin')['mch_secret_cert'], // 必填-商户私钥路径
'mch_public_cert_path' => C('weixin')['mch_public_cert_path'], // 必填-商户公钥证书路径
'notify_url' => C('host') . 'flycube.php/Api/Pay/notifyCallback', // 必填-回调通知地址
'mini_app_id' => C('weixin')['appid'], // 选填-小程序 的 app_id
'wechat_public_cert_path' => [ // 必填-微信平台公钥证书路径
'5878026B07BD819CCC25AC95FA31AE45BB6BC0D9' => C('weixin')['wechat_public_cert_path'],
],
],
],
'logger' => [ // optional
'enable' => true,
'file' => C('weixin')['payLogger_path'],
'level' => 'info', // 建议生产环境等级调整为 info开发环境为 debug
'type' => 'single', // optional, 可选 daily
'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天
],
'http' => [ // optional
'timeout' => 5.0,
'connect_timeout' => 5.0,
],
];
}
/**
* @description: Yansongda pay类的参数
*/
protected $config;
/**
* @description: 发起小程序支付
*/
public function pay()
{
//父级构造函数
parent::_initialize();
//获取订单信息
$where['order_sn'] = $_REQUEST['order_sn'];
$field = array('order_sn,shop_id,total_price,total_weight,openid,transport_price,pack_price');
$orderDb = D('order');
if (!$order = $orderDb->where($where)->field($field)->find()) {
echo json_encode(array('status' => 0, 'msg' => '订单不存在'));
exit();
}
//订单检查
$whereShop['shop_id'] = $order['shop_id'];
$fieldShop = array('price_min', 'weight_max');
$shopDb = D('shop');
if (!$shop = $shopDb->where($whereShop)->field($fieldShop)->find()) {
echo json_encode(array('status' => 0, 'msg' => '商铺不存在'));
exit();
}
if ($order['openid'] != $this->openid || (float)$order['total_price'] < (float)$shop['price_min'] || $order['total_weight'] > $shop['weight_max']) {
echo json_encode(array('status' => 0, 'msg' => '提交信息异常'));
exit();
}
//设置获取签名的订单参数
$orderParameter = [
'out_trade_no' => $order['order_sn'],
'description' => '餐品', //存商品名称吧 后期在做调整
'attach' => strval($order['shop_id']), // 将 shop_id 转为字符串 回调中用来发mqtt的主题
'amount' => [
'total' => ($order['total_price'] + $order['transport_price'] + $order['pack_price']) * 100, //单位:分
'currency' => 'CNY',
],
'payer' => [
'openid' => $this->openid,
]
];
try {
$pay = Pay::wechat($this->config)->mini($orderParameter);
echo json_encode(array('status' => 1, 'payMsg' => $pay));
} catch (\Exception $e) {
echo json_encode(array('status' => 0, 'msg' => 'Error: ' . $e->getMessage()));
}
}
/**
* @description: 支付成功后 腾讯服务器的回调
*/
public function notifyCallback()
{
try {
// 实例化 Yansongda Pay
$result = Pay::wechat($this->config)->callback();
// 验证成功,处理业务逻辑
if ($result['resource']['ciphertext']['trade_state'] == 'SUCCESS') {
$shop_id = $result['resource']['ciphertext']['attach'];
$where['order_sn'] = $result['resource']['ciphertext']['out_trade_no']; // 获取订单号
$orderDb = D('order'); // 实例化订单模型
$data['main_status'] = '已付款'; // 更新订单状态为已支付
$data['paid_time'] = time(); //标记付款时间
$data['pay_sn'] = $result['resource']['ciphertext']['transaction_id']; // 支付订单号
/*设置取餐号*/
// 获取当前时间的开始和结束时间戳
$startTime = strtotime('today');
$endTime = strtotime('tomorrow') - 1;
$whereFoodSn['main_status'] = array('in', array('已付款', '已退款'));
$whereFoodSn['order_time'] = array('between', array($startTime, $endTime));
$whereFoodSn['shop_id'] = $shop_id;
$orderCount = D('order')->where($whereFoodSn)->count();
// 新的food_sn为今天订单数加1
$data['food_sn'] = $orderCount + 1;
/*更新订单*/
$orderDb->where($where)->data($data)->save();
}
// 构建发布主题 并向地面终端提示刷新信息
$topic = 'refreshQuestList/' . $shop_id;
$this->publish($topic, 1);
} catch (\Exception $e) {
// 捕获并记录可能的异常
error_log('支付回调处理错误:' . $e->getMessage());
}
// 返回成功响应给腾讯服务器,告知通知已处理
return Pay::wechat()->success();
}
}