function get_code($order, $payment) { $merid = $this->config($payment); $ordid = "000" . $order['order_sn']; $transamt = padstr($order['order_amount'] * 100, 12); $curyid = "156"; $transdate = date('Ymd'); $transtype = ""; $version = "20070129"; // //页面返回地址(您服务器上可访问的URL),最长80位,当用户完成支付后,银行页面会自动跳转到该页面,并POST订单结果信息,可选 // $pagereturl = "$site_url/netpayclient_order_feedback.php"; // //后台返回地址(您服务器上可访问的URL),最长80位,当用户完成支付后,我方服务器会POST订单结果信息到该页面,必填 // $bgreturl = "$site_url/netpayclient_order_feedback.php"; //$frontEndUrl = $GLOBALS['ecs']->url().'respond.php'; //$backEndUrl = $GLOBALS['ecs']->url().'respond.php'; $frontEndUrl = return_url(basename(__FILE__, '.php')); $backEndUrl = return_url(basename(__FILE__, '.php')); //支付网关号,4位,上线时建议留空,以跳转到银行列表页面由用户自由选择,本示例选用0001农商行网关便于测试,可选 $gateid = "0001"; //备注,最长60位,交易成功后会原样返回,可用于额外的订单跟踪等,可选 $priv1 = $order['log_id']; $plain = $merid . $ordid . $transamt . $curyid . $transdate . $transtype . $priv1; //生成签名值,必填 $this->chkvalue = sign($plain); $html = $this->create_html($merid, $ordid, $transamt, $curyid, $transdate, $transtype, $order['log_id'], REQ_URL_PAY, $frontEndUrl); return $html; }
<?php defined('IN_DESTOON') or exit('Access Denied'); require DT_ROOT . '/api/pay/' . $bank . '/netpayclient_config.php'; //加载 netpayclient 组件 require DT_ROOT . '/api/pay/' . $bank . '/netpayclient.php'; //导入私钥文件, 返回值即为您的商户号,长度15位 $merid = buildKey(PRI_KEY); $merid or exit('导入私钥文件失败!'); //生成订单号,定长16位,任意数字组合,一天内不允许重复,本例采用当前时间戳,必填 $ordid = "00" . date('YmdHis'); //订单金额,定长12位,以分为单位,不足左补0,必填 $transamt = padstr($charge * 100, 12); //货币代码,3位,境内商户固定为156,表示人民币,必填 $curyid = "156"; //订单日期,本例采用当前日期,必填 $transdate = date('Ymd'); //交易类型,0001 表示支付交易,0002 表示退款交易 $transtype = "0001"; //接口版本号,境内支付为 20070129,必填 $version = "20070129"; //页面返回地址(您服务器上可访问的URL),最长80位,当用户完成支付后,银行页面会自动跳转到该页面,并POST订单结果信息,可选 $pagereturl = $receive_url; //后台返回地址(您服务器上可访问的URL),最长80位,当用户完成支付后,我方服务器会POST订单结果信息到该页面,必填 $bgreturl = DT_PATH . 'api/pay/' . $bank . '/notify.php'; /************************ 页面返回地址和后台返回地址的区别: 后台返回从我方服务器发出,不受用户操作和浏览器的影响,从而保证交易结果的送达。 ************************/ //支付网关号,4位,上线时建议留空,以跳转到银行列表页面由用户自由选择,本示例选用0001农商行网关便于测试,可选 $gateid = "";
} //需要查询的订单号,16位长,必填 $ordid = $_REQUEST["ordid"]; //订单日期,8位长,必填 $transdate = $_REQUEST["transdate"]; //退款金额,必须小于原始交易金额,12位长,不足左补0,必填 $refundamount = $_REQUEST["refundamount"]; //交易类型,4位长,此处表示退款方式 0002 为全额退款,0102 为部分退款,必填 $transtype = $_REQUEST["transtype"]; //备注,退款时用作退款流水号,一天内不可重复,最长40位,必填,此处使用当前时间戳仅用作演示 $priv1 = date('YmdHis'); if ($transdate == '') { $transdate = date('Ymd'); } if ($refundamount == '') { $refundamount = padstr('1', 12); } if ($transtype == '') { $transtype = '0002'; } ?> <form action="" method="get"> <label>退款流水</label><br/> <input type="text" name="priv1" value="<?php echo $priv1; ?> "><br/> <label>订单日期</label><br/> <input type="text" name="transdate" value="<?php echo $transdate; ?>
echo "货币代码: [$currencycode]<br/>"; echo "交易类型: [$transtype]<br/>"; echo "交易状态: [$status]<br/>"; echo "网关号: [$gateId]<br/>"; echo "备注: [$priv1]<br/>"; echo "签名值: [$checkvalue]<br/>"; echo "===============================<br/>"; */ //验证签名值,true 表示验证通过 $flag = verifyTransResponse($merid, $orderno, $amount, $currencycode, $transdate, $transtype, $status, $checkvalue); if ($flag) { if ($status == '1001') { //您的处理逻辑请写在这里,如更新数据库等。 //注意:如果您在提交时同时填写了页面返回地址和后台返回地址,且地址相同,请在这里先做一次数据库查询判断订单状态,以防止重复处理该笔订单 if ($priv1 != $charge_orderid) { $charge_status = 2; $charge_errcode = '订单号不匹配'; $note = $charge_errcode . 'S:' . $charge_orderid . 'R:' . $priv1; log_write($note, 'rchinapay'); } else { if ($amount != padstr($charge_money * 100, 12)) { $charge_status = 2; $charge_errcode = '充值金额不匹配'; $note = charge_errcode . 'S:' . $charge_money . 'R:' . $amount; log_write($note, 'rchinapay'); } else { $charge_status = 1; } } } }
/** * @see paymentplugin::getSendData() */ public function getSendData($payment) { //导入私钥文件, 返回值即为您的商户号,长度15位 $merid = buildKey(self::PRI_KEY); if (!$merid) { exit("导入私钥文件失败!"); } $return = array('MerId' => $merid, 'CuryId' => "156", 'TransDate' => date('Ymd'), 'TransType' => '0001', 'Version' => '20141120', 'PageRetUrl' => $this->callbackUrl, 'BgRetUrl' => $this->serverCallbackUrl, 'GateId' => ''); $return['Priv1'] = $payment['M_OrderNO']; //备注,最长60位,交易成功后会原样返回,可用于额外的订单跟踪等 $return['OrdId'] = padstr($payment['M_OrderId'], 16); //商户订单号,定长16位 $return['TransAmt'] = padstr($payment['M_Amount'] * 100, 12); //订单金额,定长12位,以分为单位,不足左补0 // 签名 //按次序组合订单信息为待签名串 $plain = $return['MerId'] . $return['OrdId'] . $return['TransAmt'] . $return['CuryId'] . $return['TransDate'] . $return['TransType'] . $return['Version'] . $return['BgRetUrl'] . $return['PageRetUrl'] . $return['GateId'] . $return['Priv1']; //生成签名值 $chkvalue = sign($plain); if (!$chkvalue) { exit("签名失败!"); } $return['ChkValue'] = $chkvalue; return $return; }
function rsa_decrypt($input) { global $private_key; $check = bchexdec($input); $modulus = bin2int($private_key["modulus"]); $exponent = bchexdec("010001"); $result = bcpowmod($check, $exponent, $modulus); $rb = bcdechex($result); return strtoupper(padstr($rb)); }
include_once "netpayclient_config.php"; ?> <title>支付交易</title> <?php //加载 netpayclient 组件 include_once "netpayclient.php"; //导入私钥文件, 返回值即为您的商户号,长度15位 $merid = buildKey(PRI_KEY); if (!$merid) { echo "导入私钥文件失败!"; exit; } //生成订单号,定长16位,任意数字组合,一天内不允许重复,本例采用当前时间戳,必填 $ordid = "00" . date('YmdHis'); //订单金额,定长12位,以分为单位,不足左补0,必填 $transamt = padstr('1', 12); //货币代码,3位,境内商户固定为156,表示人民币,必填 $curyid = "156"; //订单日期,本例采用当前日期,必填 $transdate = date('Ymd'); //交易类型,0001 表示支付交易,0002 表示退款交易 $transtype = "0001"; //接口版本号,境内支付为 20070129,必填 $version = "20070129"; //页面返回地址(您服务器上可访问的URL),最长80位,当用户完成支付后,银行页面会自动跳转到该页面,并POST订单结果信息,可选 $pagereturl = "{$site_url}/netpayclient_order_feedback.php"; //后台返回地址(您服务器上可访问的URL),最长80位,当用户完成支付后,我方服务器会POST订单结果信息到该页面,必填 $bgreturl = "{$site_url}/netpayclient_order_feedback.php"; /************************ 页面返回地址和后台返回地址的区别: 后台返回从我方服务器发出,不受用户操作和浏览器的影响,从而保证交易结果的送达。
public function config($config = null) { //导入私钥文件, 返回值即为您的商户号,长度15位 $merid = buildKey(PRI_KEY); if (!$merid) { echo "导入私钥文件失败!"; exit; } //生成订单号,定长16位,任意数字组合,一天内不允许重复,本例采用当前时间戳,必填 //$ordid = "00" . date('YmdHis'); $ordid = $config['code']; //$ordid='0000'.'90265'.time(); //$ordid=substr($ordid, 0,16); //订单金额,定长12位,以分为单位,不足左补0,必填 //$transamt = $config['money']; $money = $config['money'] * 100; $transamt = padstr($money, 12); //货币代码,3位,境内商户固定为156,表示人民币,必填 $curyid = "156"; //订单日期,本例采用当前日期,必填 $transdate = date('Ymd'); //交易类型,0001 表示支付交易,0002 表示退款交易 $transtype = "0001"; //接口版本号,境内支付为 20070129,必填 $version = "20070129"; //页面返回地址(您服务器上可访问的URL),最长80位,当用户完成支付后,银行页面会自动跳转到该页面,并POST订单结果信息,可选 $pagereturl = $config['ReturnUrl']; //后台返回地址(您服务器上可访问的URL),最长80位,当用户完成支付后,我方服务器会POST订单结果信息到该页面,必填 $bgreturl = $config['NotifyUrl']; /************************ 页面返回地址和后台返回地址的区别: 后台返回从我方服务器发出,不受用户操作和浏览器的影响,从而保证交易结果的送达。 ************************/ //支付网关号,4位,上线时建议留空,以跳转到银行列表页面由用户自由选择,本示例选用0001农商行网关便于测试,可选 $gateid = "0001"; //备注,最长60位,交易成功后会原样返回,可用于额外的订单跟踪等,可选 $priv1 = "memo"; //按次序组合订单信息为待签名串 $plain = $merid . $ordid . $transamt . $curyid . $transdate . $transtype . $priv1; //生成签名值,必填 $chkvalue = sign($plain); if (!$chkvalue) { echo "签名失败!"; exit; } //$uri = REQ_URL_PAY ; //$useragent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"; //echo $uri; //die(); // 参数数组 $data = array('MerId' => $merid, 'Version' => $version, "OrdId" => $ordid, "TransAmt" => $transamt, "CuryId" => $curyid, "TransDate" => $transdate, "TransType" => $transtype, "BgRetUrl" => $bgreturl, "PageRetUrl" => $pagereturl, "GateId" => $gateid, "Priv1" => $priv1, "ChkValue" => $chkvalue); echo "<form action=" . REQ_URL_PAY . " method='post' id='myform' >"; echo "<br>"; echo "<input type='text' name='MerId' value='" . $merid . "' />"; echo "<br>"; echo "<input type='text' name='Version' value='" . $version . "' />"; echo "<br>"; echo "<input type='text' name='OrdId' value='" . $ordid . "'/>"; echo "<br>"; echo "<input type='text' name='TransAmt' value='" . $transamt . "' />"; echo "<br>"; echo "<input type='text' name='CuryId' value='" . $curyid . "'/>"; echo "<br>"; echo "<input type='text' name='TransDate' value='" . $transdate . "' />"; echo "<input type='text' name='TransType' value='" . $transtype . "' />"; echo "<br>"; echo "<input type='text' name='BgRetUrl' value='" . $bgreturl . "' />"; echo "<br>"; echo "<input type='text' name='PageRetUrl' value='" . $pagereturl . "' />"; echo "<br>"; echo "<input type='text' name='GateId' value='" . $gateid . "' />"; echo "<br>"; echo "<input type='text' name='Priv1' value='" . $priv1 . "' />"; echo "<br>"; echo "<input type='text' name='ChkValue' value='" . $chkvalue . "' />"; echo "<br>"; echo "</form>"; //die(); echo "<script>"; echo "document.getElementById('myform').submit();"; echo "</script>"; //print_r($data); // $ch = curl_init (); // // print_r($ch); // curl_setopt ( $ch, CURLOPT_URL, $uri ); // curl_setopt($ch, CURLOPT_USERAGENT, $useragent); // //curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // curl_setopt ( $ch, CURLOPT_POST, 1 ); // curl_setopt ($ch, CURLOPT_REFERER, $uri); // curl_setopt ($ch, CURLOPT_AUTOREFERER, 1); // curl_setopt ( $ch, CURLOPT_HEADER, 0 ); // curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 ); // // curl_setopt ($ch, CURLOPT_REFERER, "http://www.php100.com/"); // curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data ); // curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // $return = curl_exec ( $ch ); // curl_close ( $ch ); //print_r($return); //die(); }
function unionpay1() { $order_sn = $_GET['order_sn']; $token = $this->token; $wecha_id = $this->wechat_id; if (empty($order_sn)) { $this->error('没有订单号'); } $order = M('b2c_order')->where(array('sn' => $order_sn, 'token' => $token, 'status' => 1))->find(); if (!$order) { $this->error('该订单不存在'); } $payment_where = array('token' => $token, 'pay_code' => 'unionpay', 'enabled' => '1'); $payment = M('b2c_payment')->where($payment_where)->find(); //$wingpay_config = unserialize($payment['pay_config']); if (empty($payment)) { $this->error('商家未设置银联支付方式!请联系商家客服!'); } if (version_compare(phpversion(), '5.4.10', '>')) { include_once LIB_PATH . 'ORG/Payment/UnionPay/lib.php'; } else { include_once LIB_PATH . 'ORG/Payment/UnionPay/netpayclient.php'; } $merid = buildKey('keys/MerPrK_808080301000216_20141106164338.key'); if (empty($merid)) { $this->error('未设置商户号!'); } $ordid = $this->get_order_no($order['sn']); $transamt = padstr($order['price'] * 100, 12); //订单交易金额,12位长度,左补0,单位:分 $curyid = '156'; //订单交易币种,3位长度,固定为人民币156 $transdate = date('Ymd'); $transtype = '0001'; //交易类型,4位长度,"0001"表示消费交易,"0002"表示退货交易 $version = '20070129'; //支付接入版本号20040916,20070129 $gateid = '8607'; $priv1 = 'wechat'; if (!signOrder($merid, $ordid, $transamt, $curyid, $transdate, $transtype)) { $this->error('订单签名验证失败!'); } $chkvalue = sign($merid . $ordid . $transamt . $curyid . $transdate . $transtype . $priv1); //PageRetUrl 返回支付后的商户网站页面 if (isset($_GET['fxs_id'])) { $pagereturl = C('site_url') . '/index.php/Fxs/Shop/my?token=' . $token . '&fxs_id=' . $_GET['fxs_id']; } elseif (isset($_GET['type'])) { $pagereturl = C('site_url') . '/index.php/Fxs/Fxs/my?token=' . $token; } else { $pagereturl = C('site_url') . '/index.php/Wap/Shop/my?token=' . $token; } //后台接受应答地址,用于商户记录交易信息和处理 $bgreturl = C('site_url') . '/index.php/unionpay/notify'; $trade = M('b2c_wingtrade')->where(array('order_sn' => $order_sn, 'token' => $token))->find(); if ($trade) { if ($trade['is_pay']) { $this->success('该订单已付款,不能重复付款!'); } } else { $serialize = array('MerId' => $merid, 'OrdId' => $ordid, 'TransAmt' => $transamt, 'CuryId' => $curyid, 'TransDate' => $transdate, 'TransType' => $transtype, 'Version' => $version, 'BgRetUrl' => $bgreturl, 'PageRetUrl' => $pagereturl, 'GateId' => $gateid, 'Priv1' => $priv1, 'ChkValue' => $chkvalue); $data = array('token' => $token, 'order_sn' => $order_sn, 'is_pay' => '0', 'set_params' => serialize($serialize), 'create_time' => time(), 'update_time' => time()); M('b2c_wingtrade')->add($data); } include_once LIB_PATH . "ORG/Payment/UnionPay/UnionPay.php"; $unionpay = new UnionPay(); $unionpay->setParameter('MerId', $merid); $unionpay->setParameter('OrdId', $ordid); $unionpay->setParameter('TransAmt', $transamt); $unionpay->setParameter('CuryId', $curyid); $unionpay->setParameter('TransDate', $transdate); $unionpay->setParameter('TransType', $transtype); $unionpay->setParameter('Version', $version); $unionpay->setParameter('BgRetUrl', $bgreturl); $unionpay->setParameter('PageRetUrl', $pagereturl); $unionpay->setParameter('GateId', $gateid); $unionpay->setParameter('Priv1', $priv1); $unionpay->setParameter('ChkValue', $chkvalue); echo $unionpay->_buildForm('web'); }
function set_options($array) { $array['price'] = padstr($array['price'] * 100, 12); $this->option = $array; }
<?php include_once 'netpayclient.php'; $merid = buildKey('keys/MerPrK_808080301000216_20141106164338.key'); if ($merid) { $ordid = "00" . date('YmdHis'); # Order ID $transamt = padstr('4444', 12); # Amount $curyid = "156"; # Currency Type, Use CNY $transdate = date('Ymd'); # Order Date $transtype = "0001"; # Transaction type, Consume $version = "20070129"; # Payment Version $pagereturl = "http://www.pinet.cc/yinlian/feedback.php"; # Feedback Url $bgreturl = "http://www.pinet.cc/yinlian/feedback.php"; $priv1 = "Wechat"; $plain = $merid . $ordid . $transamt . $curyid . $transdate . $transtype . $priv1; # The body $chkvalue = sign($plain); ?> <form action="https://payment.ChinaPay.com/pay/TransGet" method="post"> <input type=hidden name="MerId" value="<?php echo $merid; ?> "/>