<?php
/**
 * Created by PhpStorm.
 * User: tandunzhao
 * Date: 2017/12/15
 * Time: 下午2:31
 */

namespace App\Libs\allinpay;


class Pay
{
    public static $userName = "20064100000098104";
    public static $userPass = "111111";
    public static $merchantId = "200641000000981";
    public static $accountNo = "200641000000981000";

    /**
     * 通联代付
     * @param $transactionSerialNumber [交易流水号]
     * @param $bankCode [银行代码]
     * @param @param $bankName [交易银行名称]
     * @param $bankAccountNO [银行卡账号]
     * @param $bankAccountName [银行卡户主名称]
     * @param $amount [金额] 元元元
     * @param $summary [交易附言]
     * @param $remark [备注]
     * @param $channelId [渠道ID]
     * @param $is_company 0:私人； 1:公司
     * @return mixed
     */
    public static function payAllinPay($transactionSerialNumber,
                                       $bankCode,
                                       $bankName,
                                       $bankAccountNO,
                                       $bankAccountName,
                                       $amount,
                                       $summary,
                                       $remark,
                                       $channelId,
                                       $is_company) {

        $userName = "20064100000098104";
        $userPass = "111111";
        $merchantId = "200641000000981";

        //1元 转 为 100分
        $amount = $amount * 100;

        $ACCOUNT_PROP = 0;
        if("1"  == $is_company) {
            $ACCOUNT_PROP = "1";
        }

//        $userName = "20060400000044502";//测试
//        $userPass = "111111";//测试
//        $merchantId = "200604000000445";//测试

        $submitTime = date("YmdHis");
        // 源数组
//        $params = array(
//            'INFO' => array(
//                'TRX_CODE' => '100014',//交易代码 ;单笔实时代付请求
//                'VERSION' => '03',//版本
//                'DATA_TYPE' => '2',//数据格式 2：xml格式
//                'LEVEL' => '6',//处理级别           'LEVEL' => '6',//处理级别
//                'USER_NAME' => $userName,//用户名
//                'USER_PASS' => $userPass,// 用户密码
//                'REQ_SN' => $transactionSerialNumber,//交易流水号必须全局唯一，
//                //商户提交的批次号必须以商户号开头以保证与其他商户不冲突，一旦冲突交易将无法提交；
//                //建议格式：商户号+时间+固定位数顺序流水号。该字段值用于后续的查询交易、对账文件等的唯一标识，
//                //对应通联系统中的交易文件名，可以在通联系统交易查询页面查询到该值
//            ),
//            'TRANS' => array(
//                'BUSINESS_CODE' => '09900',//业务代码  见附录3.2  非空
//                'MERCHANT_ID' => $merchantId,//商户代码  商户ID  非空
//                'SUBMIT_TIME' => $submitTime,//提交时间  YYYYMMDDHHMMSS  非空
//                'E_USER_CODE' => $channelId,//用户编号  客户编号,开发人员可当作备注字段  可空
//                'BANK_CODE' => $bankCode,//银行代码  银行代码，存折必须填写。见附录3.3,强烈建议填写银行代码  存折必须填写 不填根据卡bin决定
//                'ACCOUNT_TYPE' => '00',//账号类型  银行代码，00银行卡，01存折，02信用卡。不填默认为银行卡00。 可空
//                'ACCOUNT_NO' => $bankAccountNO,//账号  银行卡或存折号码 非空
//                'ACCOUNT_NAME' => $bankAccountName,//账号名  银行卡或存折上的所有人姓名。 非空
//                'ACCOUNT_PROP' => '0',//账号属性  0私人，1公司。不填时，默认为私人0。   非空
//                'AMOUNT' => $amount,//金额  整数，单位分。   非空
//                'CURRENCY' => 'CNY',//货币类型   人民币：CNY, 港元：HKD，美元：USD。不填时，默认为人民币。  可空
//                'ID_TYPE' => '0',//开户证件类型   0：身份证,1: 户口簿，2：护照,3.军官证,4.士兵证，5. 港澳居民来往内地通行证,6. 台湾同胞来往内地通行证,7. 临时身份证,8. 外国人居留证,9. 警官证, X.其他证件   可空
//                'CUST_USERID' => $channelId,//自定义用户号  商户自定义的用户号，开发人员可当作备注字段使用   可空
//                'SUMMARY' => $summary,//交易附言  填入网银的交易备注   可空
//                'REMARK' => $remark,//备注  供商户填入参考信息   可空
//            ),
//        );
        $params = array(
            'INFO' => array(
                'TRX_CODE' => '100002',//交易代码 ;批量代付请求
                'VERSION' => '03',//版本
                'DATA_TYPE' => '2',//数据格式 2：xml格式
                'LEVEL' => '6',//处理级别           'LEVEL' => '6',//处理级别
                'USER_NAME' => $userName,//用户名
                'USER_PASS' => $userPass,// 用户密码
                'REQ_SN' => $transactionSerialNumber,//交易流水号必须全局唯一，
                //商户提交的批次号必须以商户号开头以保证与其他商户不冲突，一旦冲突交易将无法提交；
                //建议格式：商户号+时间+固定位数顺序流水号。该字段值用于后续的查询交易、对账文件等的唯一标识，
                //对应通联系统中的交易文件名，可以在通联系统交易查询页面查询到该值
            ),
            'BODY' => array(
                'TRANS_SUM' => array(
                    'BUSINESS_CODE' => '09900',//业务代码  见附录3.2  非空
                    'MERCHANT_ID' => $merchantId,//商户代码  商户ID  非空
                    'SUBMIT_TIME' => $submitTime,//提交时间  YYYYMMDDHHMMSS  非空
                    'TOTAL_ITEM' => '1',// 总记录数
                    'TOTAL_SUM' => $amount,//总金额
                    'SETTDAY' => '',//清算日期 仅供特殊商户使用,普通商户不用理会该字段 可空
                ),
                'TRANS_DETAILS'=> array(
                    'TRANS_DETAIL'=> array(
                        'SN' => $transactionSerialNumber."_00001",//记录序号 同一个请求内必须唯一。建议从0001开始递增,交易结果查询时，该字段会原样返回  非空
                        'E_USER_CODE' => $channelId,//用户编号  客户编号,开发人员可当作备注字段  可空
                        'BANK_CODE'=> $bankCode,//银行代码  银行代码，存折必须填写。见附录3.3,强烈建议填写银行代码  存折必须填写 不填根据卡bin决定
                        'ACCOUNT_TYPE' => '00',//账号类型  银行代码，00银行卡，01存折，02信用卡。不填默认为银行卡00。 可空
                        'ACCOUNT_NO' => $bankAccountNO,//账号  银行卡或存折号码 非空
                        'ACCOUNT_NAME' => $bankAccountName,//账号名  银行卡或存折上的所有人姓名。 非空
                        'PROVINCE'=> '',//开户行所在省 不带“省”或“自治区”，如 广东，广西，内蒙古等。 建议根据后附的中国邮政区号表内的“省洲名称”列的内容填写。 可空
                        'CITY'=> '',//开户行所在市 不带“市”，如 广州，南宁等。  如果是直辖市，则填区，如北京（市）朝阳（区）。 建议根据后附的中国邮政区号表内的“地区名称”列的内容填写 可空
                        'BANK_NAME'=> $bankName,//开户行名称 开户行详细名称，也叫网点，如 中国建设银行广州东山广场分理处。 可空
                        'ACCOUNT_PROP' => $ACCOUNT_PROP,//账号属性  0私人，1公司。不填时，默认为私人0。   非空
                        'AMOUNT' => $amount,//金额  整数，单位分。   非空
                        'CURRENCY' => 'CNY',//货币类型   人民币：CNY, 港元：HKD，美元：USD。不填时，默认为人民币。  可空
                        'PROTOCOL'=> '',//协议号 开发人员可省略该字段，也可以当作备注字段使用 可空
                        'PROTOCOL_USERID'=> '',// 开发人员可省略该字段，也可以当作备注字段使用  可空
                        'ID_TYPE' => '0',//开户证件类型   0：身份证,1: 户口簿，2：护照,3.军官证,4.士兵证，5. 港澳居民来往内地通行证,6. 台湾同胞来往内地通行证,7. 临时身份证,8. 外国人居留证,9. 警官证, X.其他证件   可空
                        'ID'=> '',//证件号 可空
                        'TEL'=> '',//手机号/小灵通 小灵通带区号，不带括号，减号   可空
                        'CUST_USERID' => $channelId,//自定义用户号  商户自定义的用户号，开发人员可当作备注字段使用   可空
                        'REMARK' => $remark,//备注  供商户填入参考信息   可空
                        'SETTACCT'=> '',//本交易结算户 委托扣款账号，同一批次所有明细必须一致，否则使用的账号不可预测。 可空
                        'SETTGROUPFLAG'=> '',//分组清算标志 仅供特殊商户使用，普通商户不要使用该字段，可忽略 可空
                        'SUMMARY' => $summary,//交易附言  填入网银的交易备注   可空
                        'UNION_BANK'=> '',//支付行号 可空
                    ),
                )
            ),
        );
        //发起请求
        $tools=new PhpTools();
        $result = $tools->send( $params);

//        dd($result);
//        print_r($result."\n");

        $resultCode = 0;
        $resultMsg = "";


        if($result!=FALSE){
            //echo  '验签通过，请对返回信息进行处理';
            //下面商户自定义处理逻辑，此处返回一个数组
            //INFO -> TRX_CODE 交易代码
            //INFO -> VERSION 版本
            //INFO -> DATA_TYPE 数据格式 2：xml格式
            //INFO -> REQ_SN 交易流水号
            //INFO -> RET_CODE 返回代码
            //INFO -> ERR_MSG 错误信息
            //INFO -> SIGNED_MSG 签名信息
            //TRANSRET -> MERCHANT_ID 商户代码  商户ID
            //TRANSRET -> RET_CODE 返回码  见查询交易明细响应码，本响应码为处理的最终响应码。
            //TRANSRET -> SETTLE_DAY 清算日期  YYYYMMDD
            //TRANSRET -> ERR_MSG 错误文本

            $resultCode = 0;
            $resultMsg = "验签通过";

            if(isset($result['AIPG']) && isset($result['AIPG']['INFO']) && isset($result['AIPG']['INFO']['RET_CODE'])) {
                $RET_CODE = $result['AIPG']['INFO']['RET_CODE'];
//                dd($RET_CODE);
                if($RET_CODE == "0000") {
                    $resultCode = 1;
                    $resultMsg = "受理成功";

//                } else if($RET_CODE == "0000") {
                } else {
                    $ERR_MSG = $result['AIPG']['INFO']['ERR_MSG'];
                    $resultCode = 0;
                    $resultMsg = $ERR_MSG;
                }
            }


//  0000	系统接收成功,仅仅代表请求已成功被通联受理
//	1000	报文内容检查错或者处理错（具体内容见返回错误信息）
//	1001	报文解释错
//	1002	冲正时无此交易
//	1101	金额格式有问题(版本大于04才包含，即报文中version字段为04)
//	1102	记录序号重复(版本大于04才包含)
//	1103	汇总与明细金额不等(版本大于04才包含)
//	1104	汇总笔数和明细笔数不等(版本大于04才包含)
//	1105	商户参数错(版本大于04才包含)
//	1106	签名验证错(版本大于04才包含)
//	1107	权限不足(版本大于04才包含)
//	1xxx	交易被整包拒绝的错误(版本大于0客户端必须兼容新增1xxx错误码)
//	1999	本批交易已经全部失败(最终结果)
//	1099	冲正失败请重试
//	2000	系统正在对数据处理 中间状态
//	2001	等待商户审核中间状态
//	2002	商户审核不通过 最终失败
//	2003	等待 受理中间状态
//	2004	 不通过受理最终失败
//	2005	等待 复核中间状态
//	2006	 不通过复核最终失败
//	2007	提交银行处理中间状态
//	2008	实时交易超时(中间状态,需要查询)
        } else {
            $resultCode = 0;
            $resultMsg = "验签失败";
//            print_r("验签结果：验签失败，请检查通联公钥证书是否正确");
        }

        $reqData = [
            'code' => $resultCode,
            'msg' => $resultMsg,
            'http_result_data' => $result
        ];

        return $reqData;
    }


    /**
     * 查询付款结果
     * @param $transactionSerialNumber
     * @param $reqSn
     * @return array
     */
    public static function payQuery($transactionSerialNumber, $reqSn) {
        $userName = "20064100000098104";
        $userPass = "111111";
        $merchantId = "200641000000981";

//        $reqSn = date('YmdHis').mt_rand(100000,999999);

        // 源数组
        $params = array(
            'INFO' => array(
                'TRX_CODE' => '200004',//
                'VERSION' => '03',
                'DATA_TYPE' => '2',
                'LEVEL' => '6',
                'USER_NAME' => $userName,
                'USER_PASS' => $userPass,
                'REQ_SN' => $reqSn,
            ),
            'QTRANSREQ' => array(
                'QUERY_SN' => $transactionSerialNumber,//交易批次号 也就是原请求交易中的REQ_SN的值
                'MERCHANT_ID' => $merchantId, //商户ID
                'STATUS' => '2',//状态  交易状态条件, 0成功,1失败, 2全部,3退票,4代付失败退款,5代付退票退款,6委托扣款,7提现
                'TYPE' => '1',//查询类型 0.按完成日期1.按提交日期，默认为1; 如果使用0查询，未完成交易将查不到
                'START_DAY' => '',//开始日 YYYYMMDDHHmmss 若不填QUERY_SN则必填
                'END_DAY' => ''//结束日 YYYYMMDDHHmmss 填了开始时间必填
            ),
        );

        //发起请求
        $tools=new PhpTools();
        $result = $tools->send( $params);

//        dd($result);

        $resultCode = 2;
        $resultMsg = "";

        if($result!=FALSE) {
            /*
             *   array:1 [▼
             *     "AIPG" => array:2 [▼
             *       "INFO" => array:6 [▶
             *            "TRX_CODE" => "200004"
             *            "VERSION" => "03"
             *            "DATA_TYPE" => "2"
             *            "REQ_SN" => "20171215145732858495"
             *            "RET_CODE" => "0000"
             *            "ERR_MSG" => "处理完成"
             *       ]
             *       "QTRANSRSP" => array:1 [▼
             *         "QTDETAIL" => array:14 [▼
             *           "BATCHID" => "2017121514451522_1"  //交易批次号 也就是原请求交易中的REQ_SN的值
             *           "SN" => "2017121514451522_1_00001"   //也就是原请求交易中的SN的值
             *           "TRXDIR" => "0"  //交易方向 0 付 1收
             *           "SETTDAY" => "20171215"   // 清算日期 yyyyMMdd
             *           "FINTIME" => "20171215144515"  //完成时间 yyyyMMddHHmmss
             *           "SUBMITTIME" => "20171215144515"  提交时间 yyyyMMddHHmmss
             *           "ACCOUNT_NO" => "6222031202001646388" //账号
             *           "ACCOUNT_NAME" => "宋栋波" //账号名
             *           "AMOUNT" => "12" //金额
             *           "CUST_USERID" => "1" //自定义用户号  原代收付请求报文中的CUST_USERID字段 交易请求中的原样返回
             *           "REMARK" => "remark" //备注
             *           "SUMMARY" => "summary" //交易附言
             *           "RET_CODE" => "3999" //返回码  0000处理成功，其他参见附录
             *           "ERR_MSG" => "客户付款帐户余额不足" //错误文本
             *         ]
             *       ]
             *     ]
             *   ]
             */

            if(isset($result['AIPG']) && isset($result['AIPG']['INFO']) && isset($result['AIPG']['INFO']['RET_CODE'])) {
                $RET_CODE = $result['AIPG']['INFO']['RET_CODE'];
//                dd($RET_CODE);
                if($RET_CODE == "0000") {
                    if (isset($result['AIPG']['QTRANSRSP']) && isset($result['AIPG']['QTRANSRSP']['QTDETAIL']) && isset($result['AIPG']['QTRANSRSP']['QTDETAIL']['RET_CODE'])) {
                        $RET_CODE = $result['AIPG']['QTRANSRSP']['QTDETAIL']['RET_CODE'];

                        if ($RET_CODE == "0000") {
                            $resultCode = 1;
                            $resultMsg = "处理成功";
                        } else {
                            $ERR_MSG = $result['AIPG']['QTRANSRSP']['QTDETAIL']['ERR_MSG'];
                            $resultCode = 0;
                            $resultMsg = $ERR_MSG;
                        }
//                        dd($ERR_MSG);
                    } else {
                        $resultCode = 2;
                        $resultMsg = "解析错误";
                    }
                } elseif ($RET_CODE == "2000"
                    || $RET_CODE == "2001"
                    || $RET_CODE == "2003"
                    || $RET_CODE == "2005"
                    || $RET_CODE == "2007"
                    || $RET_CODE == "2008") {
                    //中间状态，等待下次查询

                    $ERR_MSG = $result['AIPG']['INFO']['ERR_MSG'];
                    $resultCode = 2;
                    $resultMsg = $ERR_MSG;

                } else {
                    $ERR_MSG = $result['AIPG']['INFO']['ERR_MSG'];
                    //$resultCode = 0;
                    $resultMsg = $ERR_MSG;
                }
            }
        } else {
            // $resultCode = 0;
            $resultMsg = "验签失败";
//            print_r("验签结果：验签失败，请检查通联公钥证书是否正确");
        }
        $reqData = [
            'code' => $resultCode,
            'msg' => $resultMsg,
            'http_result_data' => $result
        ];

        return $reqData;
    }


    /**
     * 账户信息查询
     * @param $reqSn
     * @return array   balance:单位分
     */
    public static function payAccountInfo($reqSn) {
        // 源数组
//        $reqSn = date('YmdHis').mt_rand(100000,999999);
        $reqTime = date('YmdHis');
        $params = array(
            'INFO' => array(
                'TRX_CODE' => '300000',//
                'VERSION' => '03',
                'DATA_TYPE' => '2',
                'LEVEL' => '6',
                'USER_NAME' => self::$userName,
                'USER_PASS' => self::$userPass,
                'REQ_SN' => $reqSn,
                'REQTIME' => $reqTime,
            ),
            'ACQUERYREQ' => array(
                'ACCTNO' => self::$accountNo,//账户号
            ),
        );

        //发起请求
        $tools=new PhpTools();
        $result = $tools->send( $params);

//        dd($result);
        /**
         * array:1 [▼
         *  "AIPG" => array:2 [▼
         *    "INFO" => array:7 [▼
         *          "TRX_CODE" => "300000"
         *          "VERSION" => "03"
         *          "DATA_TYPE" => "2"
         *          "REQ_SN" => "20171225145417509551"
         *          "RET_CODE" => "0000"
         *          "ERR_MSG" => "查询成功"
         *          "REPTIME" => "20171225145417"
         *      ]
         *     "ACQUERYREP" => array:1 [▼
         *          "ACNODE" => array:11 [▼
         *               "ACCTNO" => "200641000000981000"    账户号
         *               "ACCTNAME" => "海南倍道网络科技有限公司"  账户名
         *               "BALANCE" => "9899" 余额
         *               "USABLEBAL" => "0" 可用余额
         *               "BALBY" => "2"  余额方向
         *               "DEPOSIT" => "1" 是否允许充值
         *               "WITHDRAW" => "1" 是否允许提现
         *               "TRANSFERIN" => "1" 是否允许转入
         *               "TRANSFEROUT" => "1" 是否允许转出
         *               "PAYABLE" => "1" 是否允许支付
         *               "DEFCLR" => "0" 默认结算户
         *          ]
         *      ]
         *   ]
         * ]
         */
        $resultCode = 0;
        $resultMsg = "";
        $resultBalance = 0;//余额

        if($result!=FALSE) {
            if(isset($result['AIPG']) && isset($result['AIPG']['INFO']) && isset($result['AIPG']['INFO']['RET_CODE'])) {
                $RET_CODE = $result['AIPG']['INFO']['RET_CODE'];
//                dd($RET_CODE);
                if($RET_CODE == "0000") {
                    $resultBalance = (float)$result['AIPG']['ACQUERYREP']['ACNODE']['BALANCE'];
                    $resultMsg = "查询成功";
                    $resultCode = 1;
                } else {
                    $ERR_MSG = $result['AIPG']['INFO']['ERR_MSG'];
                    $resultMsg = $ERR_MSG;
                    $resultCode = 0;
                }
            }
        } else {
            $resultCode = 0;
            $resultMsg = "验签失败";
//            print_r("验签结果：验签失败，请检查通联公钥证书是否正确");
        }
        $reqData = [
            'code' => $resultCode,
            'msg' => $resultMsg,
            'balance' => $resultBalance,
            'http_result_data' => $result
        ];
        return $reqData;
    }

    /**
     * 历史余额查询
     * @param $reqSn
     * @param $startDay 开始日期 yyyyMMdd
     * @param $endDay 结束日期 yyyyMMdd
     */
    public static function payAccountHistoryBalanceAmount($reqSn, $startDay, $endDay) {
        $reqTime = date('YmdHis');
        $params = array(
            'INFO' => array(
                'TRX_CODE' => '300001',//
                'VERSION' => '03',
                'DATA_TYPE' => '2',
                'LEVEL' => '6',
                'MERCHANT_ID' => self::$merchantId,
                'USER_NAME' => self::$userName,
                'USER_PASS' => self::$userPass,
                'REQ_SN' => $reqSn,
                'REQTIME' => $reqTime,
            ),
            'ACQUERYREQ' => array(
                'ACCTNO' => self::$accountNo,//账户号
                'STARTDAY' => $startDay,//开始日期 yyyyMMdd
                'ENDDAY' => $endDay,//结束日期 yyyyMMdd
            ),
        );

        //TODO  没有调试通过

        //发起请求
        $tools=new PhpTools();
        $result = $tools->send( $params);

        dd($result);
        /**
         * array:1 [▼
         *   "AIPG" => array:1 [▼
         *      "INFO" => array:7 [▼
         *          "TRX_CODE" => "300001"
         *          "VERSION" => "03"
         *          "DATA_TYPE" => "2"
         *          "REQ_SN" => "20171225151951469349"
         *          "RET_CODE" => "2007"
         *          "ERR_MSG" => "com.aipg.acquery.AcQueryReq cannot be cast to com.aipg.ahquery.AHQueryReq"
         *          "REPTIME" => "20171225151951"
         *      ]
         *   ]
         * ]
         */
    }
}

/**
 *  array:1 [▼
 *   "AIPG" => array:2 [▼
 *   "INFO" => array:6 [▼
 *   "TRX_CODE" => "200004"
 *   "VERSION" => "03"
 *   "DATA_TYPE" => "2"
 *   "REQ_SN" => "20171221153646302124"
 *   "RET_CODE" => "2000"
 *   "ERR_MSG" => "系统正在对数据处理"
 *   ]
 *   "QTRANSRSP" => ""
 *   ]
 *   ]
 */
/**
 * {
 *   "code": 0,
 *   "msg": "处理成功",
 *   "data": {
 *   "code": 1,
 *   "msg": "处理成功",
 *   "http_result_data": {
 *   "AIPG": {
 *      "INFO": {
 *          "TRX_CODE": "200004",
 *          "DATA_TYPE": "2",
 *          "VERSION": "03",
 *          "REQ_SN": "20171225115214521366",
 *          "RET_CODE": "0000",
 *          "ERR_MSG": "处理完成"
 *      },
 *      "QTDETAIL": {
 *          "QTRANSRSP": {
 *              "BATCHID": "2017122511504564_1",
 *              "SN": "2017122511504564_1_00001",
 *              "TRXDIR": "0",
 *              "SETTDAY": "20171225",
 *              "FINTIME": "20171225115151",
 *              "SUBMITTIME": "20171225115045",
 *              "ACCOUNT_NO": "6222031202001646388",
 *              "ACCOUNT_NAME": "宋栋波",
 *              "AMOUNT": "1",
 *              "CUST_USERID": "1",
 *              "REMARK": "remark",
 *              "SUMMARY": "summary",
 *              "RET_CODE": "0000",
 *              "ERR_MSG": "处理成功"
 *          }
 *      }
 *   }
 *  }
 *  }
 *  }
 */

/**
 * array:1 [▼
 *   "AIPG" => array:2 [▼
 *   "INFO" => array:6 [▼
 *   "TRX_CODE" => "100002"
 *   "VERSION" => "03"
 *   "DATA_TYPE" => "2"
 *   "REQ_SN" => "2017122511504564_1"
 *   "RET_CODE" => "0000"
 *   "ERR_MSG" => "受理成功"
 *   ]
 *   "BODY" => array:1 [▼
 *   "RET_DETAILS" => array:1 [▼
 *   "RET_DETAIL" => array:3 [▼
 *   "SN" => "2017122511504564_1_00001"
 *   "RET_CODE" => "0000"
 *   "ERR_MSG" => null
 *   ]
 *   ]
 *   ]
 *    ]
 *   ]
 */




























