<?php

namespace common\pay\huayin;

use backend\models\Deposit;
use common\helpers\Utils;
use common\pay\BasePayHandler;
use Yii;

class PayHandler extends BasePayHandler
{
    public $payUrl;
    public $merchantCode;
    public $publicKey;
    public $privateKey;

    /**
     * @inheritdoc
     */
    public function init()
    {
        parent::init();
        if ($this->payUrl == null) {
            $this->payUrl = Yii::$app->params['huayin.payUrl'];
        }
        if ($this->merchantCode == null) {
            $this->merchantCode = Yii::$app->params['huayin.merchantCode'];
        }
        if ($this->publicKey == null) {
            $this->publicKey = Yii::$app->params['huayin.publicKey'];
        }
        if ($this->privateKey == null) {
            $this->privateKey = Yii::$app->params['huayin.privateKey'];
        }
    }

    /**
     * @param array $deposit
     * @param array $params
     * @return string
     */
    public function outPay($deposit, $params = [])
    {
        $data = [];
        $data['merchant_code'] = $this->merchantCode; // 参数名称：商家号 商户签约时，华银分配给商家的唯一身份标识
        $data['service_type'] = 'direct_pay'; // 参数名称：服务类型 固定值：direct_pay
        $data['notify_url'] = $this->notifyUrl; // 参数名称：服务器异步通知地址 支付成功后，华银会主动发送通知给商户，商户必须指定此通知地址
        $data['interface_version'] = 'V3.0'; // 参数名称：接口版本
        $data['input_charset'] = 'UTF-8'; // 参数名称：参数编码字符集 取值：UTF-8、GBK(必须大写)
        $data['sign_type'] = 'RSA-S'; // 参数名称：签名方式
        // 1.取值为：RSA或RSA-S，RSA使用pfx证书文件进行数据加密，RSA-S使用字符串密钥进行数据加密，商户需要从中选择一个值
        // 2.该字段不参与签名
//        $data['sign'] = ''; // 参数名称：签名数据 该字段不参与签名，值如何获取，请参考华银提供的示例代码。
        $data['return_url'] = $this->returnUrl; // 参数名称：页面跳转同步通知地址 支付成功后，通过页面跳转的方式跳转到商家网站
        $data['pay_type'] = 'b2c'; // 参数名称：支付类型 取值如下（必须小写，多选时请用逗号隔开）b2c(网银支付),weixin（微信扫码）,alipay_scan（支付宝扫码）,tenpay_scan（qq钱包扫码）
        $data['client_ip'] = isset($params['ip']) ? $params['ip'] : Utils::getClientIp(); // 参数名称：客户端IP 消费者创建交易时所使用机器的IP，最大长度为15个字符。举例：183.62.225.12
        $data['client_ip_check'] = '0'; // 参数名称：客户端IP是否校验标识 当值为1校验客户端IP；当值为0不校验客户端IP；
        $data['order_no'] = $deposit['id']; // 参数名称：商家订单号 商家网站生成的订单号，由商户保证其唯一性，由字母、数字、下划线组成。
        $data['order_time'] = date('Y-m-d H:i:s'); // 参数名称：商家订单时间 时间格式：yyyy-MM-dd HH:mm:ss
        $data['order_amount'] = number_format($deposit['rmb'], 2, '.', ''); // 参数名称：商家订单金额 以元为单位，精确到小数点后两位.例如：12.01
        $data['bank_code'] = $params['bankCode']; // 参数名称：网银直连银行代码 参见附录中的银行代码对照表，当该参数为空或与对照表中银行编码不一致时，直接跳转到华银收银台选择银行页面
//        $data['redo_flag'] = ''; // 参数名称：是否允许重复订单 当值为1时不允许商户订单号重复提交；当值为 0或空时允许商户订单号重复提交
        $data['product_name'] = 'RJ' . $deposit['id']; // 参数名称：商品名称
//        $data['product_code'] = ''; // 参数名称：商品编号
//        $data['product_num'] = ''; // 参数名称：商品数量 必须是整型数字
//        $data['product_desc'] = ''; // 参数名称：商品描述
//        $data['extra_return_param'] = ''; // 参数名称：回传参数 商户如果支付请求是传递了该参数，则通知商户支付成功时会回传该参数
//        $data['extend_param'] = ''; // 参数名称：业务扩展参数 格式:参数名1^参数值1|参数名2^参数值2...，多个参数使用“|”进行分割 例如：name ^Zhang San|sex^Male 跨境商家必选，非跨境商家可选
//        $data['show_url'] = ''; // 参数名称：商品展示URL 不得超过200个字符
//        $data['orders_info'] = ''; // 储存子订单的相关信息,限制20个商品
        $data['sign'] = PayUtils::makeSign($data, $this->privateKey);

        return static::createHtml($data, $this->payUrl);
    }

    /**
     * @param array $data
     * @return bool
     */
    public function handleNotify($data)
    {
        if (PayUtils::checkSign($data, $this->publicKey)) {
            if (isset($data['trade_status']) && $data['trade_status'] == 'SUCCESS') {
                $merOrderId = trim($data['order_no']);
//                $merOrderId = str_ireplace("SN", "", $merOrderId);
                /** @var Deposit $model */
                $model = Deposit::find()->where(['id' => $merOrderId])->asArray()->limit(1)->one();
                if ($model) {
//                    $model->type = 1;
//                    $model->save(false);
                    return true;
                }
            }
        }
        return false;
    }

    public function outNotify($success)
    {
        if ($success == true) {
            return "SUCCESS";
        } else {
            return "ERROR";
        }
    }

    /**
     * @param array $data
     * @return bool
     */
    public function handleReturn($data)
    {
        if (PayUtils::checkSign($data, $this->publicKey)) {
            if (isset($data['trade_status']) && $data['trade_status'] == 'SUCCESS') {
                $merOrderId = trim($data['order_no']);
//                $merOrderId = str_ireplace("SN", "", $merOrderId);
                /** @var Deposit $model */
                $model = Deposit::find()->where(['id' => $merOrderId])->asArray()->limit(1)->one();
                if ($model) {
                    return true;
                }
            }
        }
        return false;
    }

    public function outReturn($success)
    {
    }
}