上海银联chinapay支付接口实现详解

header('Content-type: text/html; charset=gbk');
include_once("netpayclient_config.php");
?>
支付交易
//加载 netpayclient 组件
include_once("netpayclient.php");

//导入私钥文件, 返回值即为您的商户号,长度15位
$merid = buildKey(PRI_KEY);
if(!$merid) {
echo "导入私钥文件失败!";
exit;
}
//订单号跟商户号的关系:
//商户提交给ChinaPay的交易订单号,订单号的第五至第九位必须是商户号的最后五位

//生成订单号,定长16位,任意数字组合,一天内不允许重复,必填
$ordid = ecshopsn2chinapaysn(date('Ymd').mt_rand(10000,99999),$merid);
//订单金额,定长12位,以分为单位,不足左补0,必填
$transamt = formatamount(0.01);

//货币代码,3位,境内商户固定为156,表示人民币,必填
$curyid = "156";

//订单日期,本例采用当前日期,必填
$transdate = date('Ymd',time());
//交易类型,0001 表示支付交易,0002 表示退款交易
$transtype = "0001";
//接口版本号,有两个支付版本: 20070129、20040916,客户是808080开头的,就用04版本,必填
$version = "20040916";
//页面返回地址(您服务器上可访问的URL),最长80位,当用户完成支付后,银行页面会自动跳转到该页面,并POST订单结果信息,可选
$pagereturl = "$site_url/netpayclient_order_feedback.php";
//后台返回地址(您服务器上可访问的URL),最长80位,当用户完成支付后,我方服务器会POST订单结果信息到该页面,必填
$bgreturl = "$site_url/netpayclient_order_feedback.php";

/************************
页面返回地址和后台返回地址的区别:
后台返回从我方服务器发出,不受用户操作和浏览器的影响,从而保证交易结果的送达。
************************/

//支付网关号,4位,上线时建议留空,以跳转到银行列表页面由用户自由选择,本示例选用0001农商行网关便于测试,可选
$gateid = "";
//备注,最长60位,交易成功后会原样返回,可用于额外的订单跟踪等,可选
$priv1 = "memo";
//官方手册有两种签名方式:
//04的应该是第二种

//第一种:
//按次序组合订单信息为待签名串
//$plain = $merid . $ordid . $transamt . $curyid . $transdate .$transtype.$priv1;

//生成签名值,必填
//$chkvalue = sign($plain);

//第二种:
//生成签名值,必填

$chkvalue = signOrder($merid,$ordid,$transamt,$curyid,$transdate,$transtype);

if (!$chkvalue) {
echo "签名失败!";
exit;
}

?>
/*
*本地订单号转为银联订单号
*/
function ecshopsn2chinapaysn($order_sn, $vid){
if($order_sn && $vid){
$sub_vid = substr($vid, 10, 5);
$sub_start = substr($order_sn, 2, 4);
$sub_end = substr($order_sn, 6);
$temp = $pay_id;
return $sub_start . $sub_vid . $sub_end;
}
}

/*
*银联订单号转为本地订单号
*/
function chinapaysn2ecshopsn($chinapaysn){
if($chinapaysn){
$year = date('Y',time());

return substr($year,0,2) . substr($chinapaysn, 0, 4) . substr($chinapaysn, 9) ;
}
}

/*
*格式化交易金额,以分位单位的12位数字。
*/
function formatamount($amount){
if($amount){
if(!strstr($amount, ".")){
$amount = $amount.".00";
}
$amount = str_replace(".", "", $amount);
$temp = $amount;
for($i=0; $i< 12 - strlen($amount); $i++){
$temp = "0" . $temp;
}
return $temp;
}
}

?>

本接口需要 mcrypt 和 bcmath 两个PHP扩展库的支持,请查看配置


支付交易


刷新本页以改变订单号




















































你可能感兴趣的:(php)