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 * ] * ] * ] * ] * ] */