银联网关支付源码分析(银联在线网关支付)
本文目录一览:
- 1、网关支付的基本概念
- 2、银联和第三方支付网关的区别
- 3、银联支付网关问题,请帮助
- 4、银联wap支付 银联返回html源码怎么处理
- 5、银联支付的工作原理
- 6、求php银联支付简单demo(unionpay)
网关支付的基本概念
将Internet传来的数据包解密,并按照银行系统内部的通信协议将数据重新打包;接收银行版系统内部的传权回来的响应消息,将数据转换为Internet传送的数据格式,并对其进行加密。即支付网关主要完成通信、协议转换和数据加解密功能,以保护银行内部网络。
具体的说,银行使用支付网关可以实现以下功能:
(1)配置和安装Internet支付能力;
(2)避免对现有主机系统的修改;
(3)采用直观的用户图形接口进行系统管理;
(4)适应诸如扣帐卡、电子支票、电子现金以及微电子支付等电子支付手段;
(5)提供完整的商户支付处理功能,包括授权、数据捕获和结算及对帐等;
(6)通过对Internet上交易的报告和跟踪,对网上活动进行监视;
(7)通过采用RSA公共密钥加密和SET协议,可以确保网络交易的安全性;
(8)使Internet的支付处理过程与当前支付处理商的业务模式相符,确保商户信息管理上的一致性,并为支付处理商进入Internet交易处理提供机会
目前个人网上支付的最新发展 网关是银行金融网络机构内部数据的一组服务设备或由指派的第三方处理商家支付信息和顾客的支付指令。 网关支付的特点将Interent传来的数据包解密并按照银行系统内部的通信协议将数据重新打包接受银行系统内部的传回来的响应消息将数据转换Interent传送的数据格式并对其进行加密即支付网关主要完成通信、协议转换和数据加密功能以保护银行内部网络。
优点利用电子商务进行商品交易人们越来越倾向于网络支付这是因为网络支付具有方便、快速的优点。 缺点受经济利益的驱动在电子数据的网络传输过程中信息经常遭到不法之徒的拦截、窃取、篡改。冒用甚至恶意破坏给电子商务活动带来重大损失。 第三方支付所谓第三方支付就是一些产品所在国家以及国外各大银行签约、并具备一定的实力和信誉保障的第三方独立机构提供的交易平台在第三方支付平台中买方选购商品后使用第三方平台提供的账户进行贷款支付由第三方通知卖家货款到达、进行发货买方检验货物后就可以通知付款给卖家第三方再次将货款转至卖家账户。
优点在进行网络支付时信用卡号及密码的纰漏只在持卡人和银行之间转移降低了应通过商家转移而导致的风险。 移动支付是由移动运营商、移动应用服务提供和金融机构共同推出的构建在移动运营支撑系统上的一个移动数据增值业务应用。移动支付系统将为每个移动用户建立一个与其手机号码关联的支付帐户其功能相当于电子钱包为移动用户提供了一个通过手机进行交易支付和身份认证的途径。 移动支付是允许用户使用其移动终端通常是手机对所消费的商品或服务进行账务支付的一种服务方式。使整个移动支付价值链包括移动运营商、支付服务商比如银行、银联等应用提供商公交、校园、公共事业等、设备提供商终端厂商、卡供应商、芯片提供商等、系统集成商、商家和终端用户。
优点1.功能便利。 2.使用范围广泛。 3.安全性好。 4.收费低廉。 5.可以进行第二次交易。 缺点1.平台运营商简化了其他群体之间的关系但在无形中为自己增加了处理各种关系的负担在商务运作上工作量比较大。 2.对于平台运营商的要求很高包括市场推广能力、技术研发能力、资金运作能力等方面都要求平台运营商有很高的行业号召力和认知度。
银联和第三方支付网关的区别
网关,就等同于一个市场,有了市场,就会有经济利益!
如果只有银联的网关,没有第三方的话,那是什么?只有一个人做的市场成了什么??
因此各家银行有自己的支付网关,方便自己发行的卡进行支付!
就是这个道理了!!
使用支付网关,支付了多少钱,就同在刷卡机上进行消费,消费了多少钱是一个道理,是要付手续费的!!
银联支付网关问题,请帮助
如果楼主以前操作成功,现在不行的话,应该是时间段的问题.建议:
利用上午时间段先买入相应基金的货币,届时再转.用银联通转帐是很慢的.何况你选下午2点多,人正多.
而在基金公司的网站上做转换就快多了.
这是本人的切身体会!!
银联wap支付 银联返回html源码怎么处理
789 5100082 验证签名失败 一般为非正常访问支付页面地址(就是截图中的地址)。请用demo代码生成的html自动跳转前台交易地址后,由前台交易地址再自动跳转银联支付页面,请勿直接访问支付页面地址,这样做可能会因中文处理不到导致发生此问题(可不送中文试试);另外也请不要对前台交易地址应答的自动跳转表单做任何处理。
银联支付的工作原理
先想想ATM机,你用中行的卡在工行的机器上取钱,就是工行和中行的系统通过银联提供的系统平台进行数据传送使交易完成。POS机也一样是客人的发卡行和商家的结算行的系统通过银联连接。
结算行最重要。它提供系统使交易完成,并负责将刷卡产生的资金打到商家的开户账户去,所以要向商家收取费用,这就是手续费的由来。手续费实际上没有统一标准,你能和这个银行谈个满意的价钱就指定它做结算行,往往银行连POS机也一并提供给你了,它只是个信息的硬件载体而已,银联也只是个信息传送平台,只有银行有权利发送交易的指令和划拨资金。
POS机必须和银联的网络连上才能交易。连上的方式不同就产生了不同类型的POS。这可以理解为打电话。插电话线的POS是大部分,就像电信最普遍一样;用移动GPRS网络的是移动POS,就像手机可以随身带一样。连电脑的叫作MISPOS,它是便于大型的商家对许多的POS采取统一管理而设置的,一般商家用不到。这样产生的费用就是通讯费了,商家付给电信移动,和银行银联都没关系。
银联有个子公司叫银联商务,它负责提供并安装POS机以及机器的硬件维护。你可以向它们申请安装机器,以后的维护除非人为损坏也不要钱的。它们怎么赚钱呢?再去和银行谈。所以商家和银联实际上是没有直接资金往来的,如果你机器是银联装的,那机器问题找银联,账务问题找银行。如果机器也是银行提供的,那就全找结算行就对了。
累死我了,你给我追加分啊!其实还有很多细节,特别是各个地区有些微的差别,但总体上这些是基本情况。
求php银联支付简单demo(unionpay)
?php
namespace common\services;
class UnionPay
{
/**
* 支付配置
* @var array
*/
public $config = [];
/**
* 支付参数,提交到银联对应接口的所有参数
* @var array
*/
public $params = [];
/**
* 自动提交表单模板
* @var string
*/
private $formTemplate = 'HTML'
!DOCTYPE HTML
html
head
meta charset="utf-8"
title支付/title
/head
body
div style="text-align:center"跳转中.../div
form id="pay_form" name="pay_form" action="%s" method="post"
%s
/form
script type="text/javascript"
document.onreadystatechange = function(){
if(document.readyState == "complete") {
document.pay_form.submit();
}
};
/script
/body
/html
HTML;
/**
* 构建自动提交HTML表单
* @return string
*/
public function createPostForm()
{
$this-params['signature'] = $this-sign();
$input = '';
foreach($this-params as $key = $item) {
$input .= "\t\tinput type=\"hidden\" name=\"{$key}\" value=\"{$item}\"\n";
}
return sprintf($this-formTemplate, $this-config['frontUrl'], $input);
}
/**
* 验证签名
* 验签规则:
* 除signature域之外的所有项目都必须参加验签
* 根据key值按照字典排序,然后用拼接key=value形式待验签字符串;
* 然后对待验签字符串使用sha1算法做摘要;
* 用银联公钥对摘要和签名信息做验签操作
*
* @throws \Exception
* @return bool
*/
public function verifySign()
{
$publicKey = $this-getVerifyPublicKey();
$verifyArr = $this-filterBeforSign();
ksort($verifyArr);
$verifyStr = $this-arrayToString($verifyArr);
$verifySha1 = sha1($verifyStr);
$signature = base64_decode($this-params['signature']);
$result = openssl_verify($verifySha1, $signature, $publicKey);
if($result === -1) {
throw new \Exception('Verify Error:'.openssl_error_string());
}
return $result === 1 ? true : false;
}
/**
* 取签名证书ID(SN)
* @return string
*/
public function getSignCertId()
{
return $this-getCertIdPfx($this-config['signCertPath']);
}
/**
* 签名数据
* 签名规则:
* 除signature域之外的所有项目都必须参加签名
* 根据key值按照字典排序,然后用拼接key=value形式待签名字符串;
* 然后对待签名字符串使用sha1算法做摘要;
* 用银联颁发的私钥对摘要做RSA签名操作
* 签名结果用base64编码后放在signature域
*
* @throws \InvalidArgumentException
* @return multitype|string
*/
private function sign() {
$signData = $this-filterBeforSign();
ksort($signData);
$signQueryString = $this-arrayToString($signData);
if($this-params['signMethod'] == 01) {
//签名之前先用sha1处理
//echo $signQueryString;exit;
$datasha1 = sha1($signQueryString);
$signed = $this-rsaSign($datasha1);
} else {
throw new \InvalidArgumentException('Nonsupport Sign Method');
}
return $signed;
}
/**
* 数组转换成字符串
* @param array $arr
* @return string
*/
private function arrayToString($arr)
{
$str = '';
foreach($arr as $key = $value) {
$str .= $key.'='.$value.'';
}
return substr($str, 0, strlen($str) - 1);
}
/**
* 过滤待签名数据
* signature域不参加签名
*
* @return array
*/
private function filterBeforSign()
{
$tmp = $this-params;
unset($tmp['signature']);
return $tmp;
}
/**
* RSA签名数据,并base64编码
* @param string $data 待签名数据
* @return mixed
*/
private function rsaSign($data)
{
$privatekey = $this-getSignPrivateKey();
$result = openssl_sign($data, $signature, $privatekey);
if($result) {
return base64_encode($signature);
}
return false;
}
/**
* 取.pfx格式证书ID(SN)
* @return string
*/
private function getCertIdPfx($path)
{
$pkcs12certdata = file_get_contents($path);
openssl_pkcs12_read($pkcs12certdata, $certs, $this-config['signCertPwd']);
$x509data = $certs['cert'];
openssl_x509_read($x509data);
$certdata = openssl_x509_parse($x509data);
return $certdata['serialNumber'];
}
/**
* 取.cer格式证书ID(SN)
* @return string
*/
private function getCertIdCer($path)
{
$x509data = file_get_contents($path);
openssl_x509_read($x509data);
$certdata = openssl_x509_parse($x509data);
return $certdata['serialNumber'];
}
/**
* 取签名证书私钥
* @return resource
*/
private function getSignPrivateKey()
{
$pkcs12 = file_get_contents($this-config['signCertPath']);
openssl_pkcs12_read($pkcs12, $certs, $this-config['signCertPwd']);
return $certs['pkey'];
}
/**
* 取验证签名证书
* @throws \InvalidArgumentException
* @return string
*/
private function getVerifyPublicKey()
{
//先判断配置的验签证书是否银联返回指定的证书是否一致
if($this-getCertIdCer($this-config['verifyCertPath']) != $this-params['certId']) {
throw new \InvalidArgumentException('Verify sign cert is incorrect');
}
return file_get_contents($this-config['verifyCertPath']);
}
}
//银联支付设置
'unionpay' = [
//测试环境参数
'frontUrl' = '', //前台交易请求地址
//'singleQueryUrl' = '', //单笔查询请求地址
'signCertPath' = __DIR__.'/../keys/unionpay/test/sign/700000000000001_acp.pfx', //签名证书路径
'signCertPwd' = '000000', //签名证书密码
'verifyCertPath' = __DIR__.'/../keys/unionpay/test/verify/verify_sign_acp.cer', //验签证书路径
'merId' = 'xxxxxxx',
//正式环境参数
//'frontUrl' = '', //前台交易请求地址
//'singleQueryUrl' = '', //单笔查询请求地址
//'signCertPath' = __DIR__.'/../keys/unionpay/test/sign/PM_700000000000001_acp.pfx', //签名证书路径
//'signCertPwd' = '000000', //签名证书密码
//'verifyCertPath' = __DIR__.'/../keys/unionpay/test/verify/verify_sign_acp.cer', //验签证书路径
//'merId' = 'xxxxxxxxx', //商户代码
],