$kq_all_para .= kq_ck_null($payerName, 'payerName'); $kq_all_para .= kq_ck_null($payerContactType, 'payerContactType'); $kq_all_para .= kq_ck_null($payerContact, 'payerContact'); $kq_all_para .= kq_ck_null($orderId, 'orderId'); $kq_all_para .= kq_ck_null($orderAmount, 'orderAmount'); $kq_all_para .= kq_ck_null($orderTime, 'orderTime'); $kq_all_para .= kq_ck_null($productName, 'productName'); $kq_all_para .= kq_ck_null($productNum, 'productNum'); $kq_all_para .= kq_ck_null($productId, 'productId'); $kq_all_para .= kq_ck_null($productDesc, 'productDesc'); $kq_all_para .= kq_ck_null($ext1, 'ext1'); $kq_all_para .= kq_ck_null($ext2, 'ext2'); $kq_all_para .= kq_ck_null($payType, 'payType'); $kq_all_para .= kq_ck_null($bankId, 'bankId'); $kq_all_para .= kq_ck_null($redoFlag, 'redoFlag'); $kq_all_para .= kq_ck_null($pid, 'pid'); $kq_all_para = substr($kq_all_para, 0, strlen($kq_all_para) - 1); ///////////// RSA 签名计算 ///////// 开始 // $fp = fopen(DT_ROOT . "/api/pay/" . $bank . "/pcarduser.pem", "r"); $priv_key = fread($fp, 123456); fclose($fp); $pkeyid = openssl_get_privatekey($priv_key); // compute signature openssl_sign($kq_all_para, $signMsg, $pkeyid, OPENSSL_ALGO_SHA1); // free the key from memory openssl_free_key($pkeyid); $signMsg = base64_encode($signMsg); ///////////// RSA 签名计算 ///////// 结束 // //https://sandbox.99bill.com/gateway/recvMerchantInfoAction.htm //https://www.99bill.com/gateway/recvMerchantInfoAction.htm ?>
$kq_check_all_para .= kq_ck_null($_REQUEST['bankDealId'], 'bankDealId'); //快钱交易时间,快钱对交易进行处理的时间,格式:yyyyMMddHHmmss,如:20071117020101 $kq_check_all_para .= kq_ck_null($_REQUEST['dealTime'], 'dealTime'); //商户实际支付金额 以分为单位。比方10元,提交时金额应为1000。该金额代表商户快钱账户最终收到的金额。 $kq_check_all_para .= kq_ck_null($_REQUEST['payAmount'], 'payAmount'); //费用,快钱收取商户的手续费,单位为分。 $kq_check_all_para .= kq_ck_null($_REQUEST['fee'], 'fee'); //扩展字段1,该值与提交时相同 $kq_check_all_para .= kq_ck_null($_REQUEST['ext1'], 'ext1'); //扩展字段2,该值与提交时相同。 $kq_check_all_para .= kq_ck_null($_REQUEST['ext2'], 'ext2'); //处理结果, 10支付成功,11 支付失败,00订单申请成功,01 订单申请失败 $kq_check_all_para .= kq_ck_null($_REQUEST['payResult'], 'payResult'); //错误代码 ,请参照《人民币网关接口文档》最后部分的详细解释。 $kq_check_all_para .= kq_ck_null($_REQUEST['errCode'], 'errCode'); $kq_check_all_para .= kq_ck_null($key, "key"); $kq_check_all_para = substr($kq_check_all_para, 0, strlen($kq_check_all_para) - 1); $merchantSignMsg = md5($kq_check_all_para); //获取加密签名串 $signMsg = trim($_REQUEST['signMsg']); //初始化结果及地址 $rtnOk = 0; $rtnUrl = ""; //商家进行数据处理,并跳转会商家显示支付结果的页面 ///首先进行签名字符串验证 if (strtoupper($signMsg) == strtoupper($merchantSignMsg)) { switch ($_REQUEST['payResult']) { case '10': //此处做商户逻辑处理 if (substr($_REQUEST['orderId'], 0, 2) == 'dz') { $updatesql = "update sline_dzorder set status=2 where ordersn='{$_REQUEST['orderId']}'";
//银行交易号 ,快钱交易在银行支付时对应的交易号,如果不是通过银行卡支付,则为空 $kq_check_all_para .= kq_ck_null($_REQUEST[bankDealId], 'bankDealId'); //快钱交易时间,快钱对交易进行处理的时间,格式:yyyyMMddHHmmss,如:20071117020101 $kq_check_all_para .= kq_ck_null($_REQUEST[dealTime], 'dealTime'); //商户实际支付金额 以分为单位。比方10元,提交时金额应为1000。该金额代表商户快钱账户最终收到的金额。 $kq_check_all_para .= kq_ck_null($_REQUEST[payAmount], 'payAmount'); //费用,快钱收取商户的手续费,单位为分。 $kq_check_all_para .= kq_ck_null($_REQUEST[fee], 'fee'); //扩展字段1,该值与提交时相同 $kq_check_all_para .= kq_ck_null($_REQUEST[ext1], 'ext1'); //扩展字段2,该值与提交时相同。 $kq_check_all_para .= kq_ck_null($_REQUEST[ext2], 'ext2'); //处理结果, 10支付成功,11 支付失败,00订单申请成功,01 订单申请失败 $kq_check_all_para .= kq_ck_null($_REQUEST[payResult], 'payResult'); //错误代码 ,请参照《人民币网关接口文档》最后部分的详细解释。 $kq_check_all_para .= kq_ck_null($_REQUEST[errCode], 'errCode'); $trans_body = substr($kq_check_all_para, 0, strlen($kq_check_all_para) - 1); $MAC = base64_decode($_REQUEST[signMsg]); $fp = fopen(DT_ROOT . "/api/pay/" . $bank . "/" . $PAY[$bank]['cert'], "r"); $cert = fread($fp, 8192); fclose($fp); $pubkeyid = openssl_get_publickey($cert); $ok = openssl_verify($trans_body, $MAC, $pubkeyid); if ($ok == 1) { switch ($_REQUEST[payResult]) { case '10': //此处做商户逻辑处理 $itemid = intval($_REQUEST['orderId']); $amount = $_REQUEST['payAmount'] / 100; $r = $db->get_one("SELECT * FROM {$DT_PRE}finance_charge WHERE itemid='{$itemid}'"); if ($r) {
public function kqrv() { $my_config = (require APPPATH . 'config/mail.php'); $flag = 0; //是否成功更新MT4余额 $status = ""; set_time_limit(0); ini_set('date.timezone', 'PRC'); function kq_ck_null($kq_va, $kq_na) { if ($kq_va == "") { return $kq_va = ""; } else { return $kq_va = $kq_na . '=' . $kq_va . '&'; } } // 人民币网关账号,该账号为11位人民币网关商户编号+01,该值与提交时相同。 $kq_check_all_para = kq_ck_null($_REQUEST['merchantAcctId'], 'merchantAcctId'); // 网关版本,固定值:v2.0,该值与提交时相同。 $kq_check_all_para .= kq_ck_null($_REQUEST['version'], 'version'); // 语言种类,1代表中文显示,2代表英文显示。默认为1,该值与提交时相同。 $kq_check_all_para .= kq_ck_null($_REQUEST['language'], 'language'); // 签名类型,该值为4,代表PKI加密方式,该值与提交时相同。 $kq_check_all_para .= kq_ck_null($_REQUEST['signType'], 'signType'); // 支付方式,一般为00,代表所有的支付方式。如果是银行直连商户,该值为10,该值与提交时相同。 $kq_check_all_para .= kq_ck_null($_REQUEST['payType'], 'payType'); // 银行代码,如果payType为00,该值为空;如果payType为10,该值与提交时相同。 $kq_check_all_para .= kq_ck_null($_REQUEST['bankId'], 'bankId'); // 商户订单号,,该值与提交时相同。 $kq_check_all_para .= kq_ck_null($_REQUEST['orderId'], 'orderId'); // 订单提交时间,格式:yyyyMMddHHmmss,如:20071117020101,该值与提交时相同。 $kq_check_all_para .= kq_ck_null($_REQUEST['orderTime'], 'orderTime'); // 订单金额,金额以“分”为单位,商户测试以1分测试即可,切勿以大金额测试,该值与支付时相同。 $kq_check_all_para .= kq_ck_null($_REQUEST['orderAmount'], 'orderAmount'); // 快钱交易号,商户每一笔交易都会在快钱生成一个交易号。 $kq_check_all_para .= kq_ck_null($_REQUEST['dealId'], 'dealId'); // 银行交易号 ,快钱交易在银行支付时对应的交易号,如果不是通过银行卡支付,则为空 $kq_check_all_para .= kq_ck_null($_REQUEST['bankDealId'], 'bankDealId'); // 快钱交易时间,快钱对交易进行处理的时间,格式:yyyyMMddHHmmss,如:20071117020101 $kq_check_all_para .= kq_ck_null($_REQUEST['dealTime'], 'dealTime'); // 商户实际支付金额 以分为单位。比方10元,提交时金额应为1000。该金额代表商户快钱账户最终收到的金额。 $kq_check_all_para .= kq_ck_null($_REQUEST['payAmount'], 'payAmount'); // 费用,快钱收取商户的手续费,单位为分。 $kq_check_all_para .= kq_ck_null($_REQUEST['fee'], 'fee'); // 扩展字段1,该值与提交时相同 $kq_check_all_para .= kq_ck_null($_REQUEST['ext1'], 'ext1'); // 扩展字段2,该值与提交时相同。 $kq_check_all_para .= kq_ck_null($_REQUEST['ext2'], 'ext2'); // 处理结果, 10支付成功,11 支付失败,00订单申请成功,01 订单申请失败 $kq_check_all_para .= kq_ck_null($_REQUEST['payResult'], 'payResult'); // 错误代码 ,请参照《人民币网关接口文档》最后部分的详细解释。 $kq_check_all_para .= kq_ck_null($_REQUEST['errCode'], 'errCode'); $trans_body = substr($kq_check_all_para, 0, strlen($kq_check_all_para) - 1); $MAC = base64_decode($_REQUEST['signMsg']); $fp = fopen(FCPATH . 'public/pay/99bill.cert.rsa.20140728.cer', "r"); $cert = fread($fp, 8192); fclose($fp); $pubkeyid = openssl_get_publickey($cert); $ok = openssl_verify($trans_body, $MAC, $pubkeyid); if ($ok == 1) { switch ($_REQUEST['payResult']) { case '10': // 支付成功,业务逻辑处理 $rtnOK = 1; $rtnUrl = site_url('user/show') . '?msg=success'; $my_id = $_REQUEST['orderId']; //自定义订单号 $id = $_REQUEST['dealId']; //快钱交易号 $r5_Pid = $_REQUEST['ext1']; //用户字段 $amount = $_REQUEST['orderAmount'] / 100; // 分转为元 $mydate = $_REQUEST['dealTime']; //交易时间 20130508135432 //时间判断 当前时间大于订单时间8分钟则不处理 $d_time = strtotime($mydate); if (time() - $d_time > 8 * 60) { exit; } // 检查订单是否已处理,防止重复入金 $this->load->model('depositmodel'); if ($this->depositmodel->is_deposit($id)) { break; } //写入redis $r_message = '用户<span>' . $r5_Pid . '</span>在线入金<span>¥' . $amount . '</span>---' . ($date = date('Y-m-d H:i:s', $d_time)); $this->save_item_in_redis($r_message); //更新订单 $params = array('order_id' => $id, 'is_ok' => 1); $this->depositmodel->changeOrder($params, $my_id); $server_name = $this->depositmodel->getServerName($my_id); // 更新账户余额 if ($my_config['is_rj'] == 1) { $local_port = $this->depositmodel->getServerLocalPort($my_id); if ($local_port === FALSE) { break; } $this->load->model('exchange_rate_model'); $hl = $this->exchange_rate_model->get_exchange_rate(); //取汇率 $huilv = $hl[0]->deposit_rate; $deposit_factor = $hl[0]->deposit_factor; $params['login'] = $r5_Pid; $params['value'] = round($amount * $deposit_factor / $huilv, 2); $params['comment'] = "D online {$id}"; $this->load->model('usermodel'); $data = $this->usermodel->changeBlance($params, $local_port); $result = $this->parseMT4Answer($data); if ($result['success'] === TRUE || isset($result['']) && is_null($result[''])) { $status .= "更新交易账户余额成功。\r\n"; $flag = 1; } else { $status .= $result['reason'] . ",本次入金未更新至账户,请手动处理。\r\n"; } } else { $flag = 2; //未开启此功能 } //更新订单 $params = array('is_success' => $flag); $this->depositmodel->changeOrder($params, $my_id); // 发送邮件通知 if ($my_config['is_open'] == 1) { $this->load->library('email'); $config['protocol'] = 'smtp'; $config['smtp_host'] = $my_config['email']['host']; $config['smtp_user'] = $my_config['email']['username']; $config['smtp_pass'] = $my_config['email']['password']; $config['smtp_port'] = 25; $config['charset'] = $my_config['email']['charset']; $config['crlf'] = "\r\n"; $config['newline'] = "\r\n"; $config['wordwrap'] = TRUE; $this->email->initialize($config); $this->email->from($my_config['email']['username'], 'Admin'); $this->email->to($my_config['list']); if ($flag === 1) { $subject = "在线入金通知[更新成功]"; } elseif ($flag === 0) { $subject = "在线入金通知[更新失败-{$status}]"; } else { $subject = "在线入金通知"; } $content = "账户ID:{$r5_Pid}\r\n" . "金额(¥):{$amount}\r\n" . "服务器:{$server_name}\r\n" . "订单号:{$id}\r\n" . "时间:" . date('Y-m-d H:i:s', strtotime($mydate)) . "\r\n与MT4服务器交互状态:\r\n" . $status; $this->email->subject($subject); $this->email->message($content); $this->email->send(); } break; default: $rtnOK = 1; // 支付失败 $rtnUrl = site_url('user/show') . '?msg=false'; break; } } else { $rtnOK = 1; // 验证签名失败 $rtnUrl = site_url('user/show') . '?msg=error'; } $vdata = array('rtnOK' => $rtnOK, 'rtnUrl' => $rtnUrl); $this->load->view('kqrv', $vdata); }
$kq_all_para .= kq_ck_null($orderAmount, 'orderAmount'); $kq_all_para .= kq_ck_null($orderTime, 'orderTime'); $kq_all_para .= kq_ck_null($productName, 'productName'); $kq_all_para .= kq_ck_null($productNum, 'productNum'); $kq_all_para .= kq_ck_null($productId, 'productId'); $kq_all_para .= kq_ck_null($productDesc, 'productDesc'); $kq_all_para .= kq_ck_null($ext1, 'ext1'); $kq_all_para .= kq_ck_null($ext2, 'ext2'); $kq_all_para .= kq_ck_null($payType, 'payType'); $kq_all_para .= kq_ck_null($bankId, 'bankId'); $kq_all_para .= kq_ck_null($redoFlag, 'redoFlag'); $kq_all_para .= kq_ck_null($pid, 'pid'); //人民币网关密钥 ///区分大小写.请与快钱联系索取 $key = $GLOBALS['cfg_bill_key']; $kq_all_para .= kq_ck_null($key, 'key'); $kq_all_para = substr($kq_all_para, 0, strlen($kq_all_para) - 1); //echo $kq_all_para; $signMsg = strtoupper(md5($kq_all_para)); ///////////// RSA 签名计算 ///////// 开始 // /* $fp = fopen("./99bill-rsa.pem", "r"); $priv_key = fread($fp,123456); fclose($fp); $pkeyid = openssl_get_privatekey($priv_key); // compute signature openssl_sign($kq_all_para, $signMsg, $pkeyid,OPENSSL_ALGO_SHA1); // free the key from memory openssl_free_key($pkeyid);