<?php

namespace Api\Controller;

use Yansongda\Pay\Pay;
use PhpMqtt\Client\MqttClient;
use PhpMqtt\Client\Exceptions\MqttClientException;
use PhpMqtt\Client\ConnectionSettings;

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'];
        $orderDb = D('order');
        $order = $orderDb->where($where)->find();
        //设置获取签名的订单参数
        $token = $this->makeToken(array('shop_id' => $order['shop_id'], 'exp' => strtotime('+100 years')));
        $orderParameter = [
            'out_trade_no' => $order['order_sn'],
            'description' => $token, //用jwt加密 shop_id商铺id 存放
            'amount' => [
                'total' => $order['total_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()
    {
        // 实例化 Yansongda Pay
        $result = Pay::wechat($this->config)->callback();

        $this->publish('refreshQuestList/2dc23dcfecc05fb1', 1);
        try {
            // 验证成功，处理业务逻辑
            if ($result['resource']['ciphertext']['trade_state'] == 'SUCCESS') {
                $where['order_sn'] = $result['resource']['ciphertext']['out_trade_no']; // 获取订单号
                $orderDb = D('order'); // 实例化订单模型
                $data['status'] = 'pending'; // 更新订单状态为已支付
                $data['pay_sn'] = $result['resource']['ciphertext']['transaction_id']; // 支付订单号
                // 更新订单
                $orderDb->where($where)->data($data)->save();
            }
            // 构建发布主题 并向地面终端提示刷新信息
            $topic = 'refreshQuestList/' . $result['resource']['ciphertext']['description'];
            $this->publish($topic, 1);
        } catch (\Exception $e) {
            // 捕获并记录可能的异常
            error_log('支付回调处理错误：' . $e->getMessage());
        }
        // 返回成功响应给腾讯服务器，告知通知已处理
        return Pay::wechat()->success();
    }
}
