<?php

namespace Api\Controller;

use Firebase\JWT\JWT;
use Firebase\JWT\Key;
use Yansongda\Pay\Pay;
use Yansongda\Pay\Logger;

class PayController extends PublicController
{
    private $openid; // 用户openid
    private $session_key; // 用户session_key
    protected $config = [
        'wechat' => [
            'default' => [
                'mch_id' => '1625070753', // 必填-商户号
                'mch_secret_key' => 'qwertyuiopasdfghjklzxcvbnm123456', // 必填-v3商户秘钥
                'mch_secret_cert' => 'C:/phpstudy_pro/cert/apiclient_key.pem', // 必填-商户私钥路径
                'mch_public_cert_path' => 'C:/phpstudy_pro/cert/apiclient_cert.pem', // 必填-商户公钥证书路径
                'notify_url' => 'https://szdot.top/flycube.php/Api/Pay/notifyCallback', // 必填-回调通知地址
                'mini_app_id' => 'wx8347571d6893a383', // 选填-小程序 的 app_id
                // 必填-微信平台公钥证书路径
                'wechat_public_cert_path' => [
                    '5878026B07BD819CCC25AC95FA31AE45BB6BC0D9' => 'C:/phpstudy_pro/cert/wechatpay_5878026B07BD819CCC25AC95FA31AE45BB6BC0D9.pem',
                ],
            ],
        ],
        'logger' => [ // optional
            'enable' => true,
            'file' => 'C:/phpstudy_pro/cert/logs/wechat.log',
            '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: 子类的初始化
     */
    public function _initialize()
    {
        parent::_initialize();

        // 解析HTTP请求头中的token
        if ($_REQUEST['order_sn']) {
            //解构文件头里面的token
            $server = isset($_SERVER) ? $_SERVER : "";
            $token = $server['HTTP_TOKEN'];
            $jwtKey = C('jwtKey'); // jwt密钥
            $jwt = JWT::decode($token, new Key($jwtKey, 'HS256')); // 使用密钥和 HS256 算法对 JWT 进行解码
            $res_token = (array) $jwt; // 将解码后的对象转换为数组
            //token过期
            if (empty($res_token)) {
                echo json_encode(array('status' => -1, 'msg' => '帐号认证过期!'));
                exit();
            }
            //token检测通过 获取用户id
            $this->openid = $res_token['openid'];
            $this->session_key = $res_token['session_key'];
        }
    }

    /**
     * @description: 发起小程序支付
     */
    public function pay()
    {
        $order = [
            'out_trade_no' => time() . '',
            'description' => 'subject-测试',
            'amount' => [
                'total' => 1,
                'currency' => 'CNY',
            ],
            'payer' => [
                'openid' => $this->openid,
            ]
        ];

        try {
            $pay = Pay::wechat($this->config)->mini($order);
            //Logger::debug('Paying...', $order->all()); //打印日志
            echo json_encode($pay);
        } catch (\Exception $e) {
            echo 'Error: ' . $e->getMessage();
        }
    }

    public function notifyCallback()
    {
        $pay = Pay::wechat($this->config);

        try {
            $data = $pay->callback(); // 是的，验签就这么简单！
        } catch (\Exception $e) {
            // $e->getMessage();
        }

        return $pay->success();
    }
}
