本文目錄一覽:
- 1、求php銀聯支付簡單demo(unionpay)
- 2、親,php銀聯在線支付,沒做過,請求幫助
- 3、PHP怎麼做銀聯的支付介面調用
- 4、中國銀聯在線支付介面php開發怎麼做
- 5、PHP銀聯在線支付開發怎麼自動跳轉支付成功界面
求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’, //商戶代碼
],
親,php銀聯在線支付,沒做過,請求幫助
支付介面現在有第三方的支付介面也有銀行的支付介面。這裡就來介紹php版本銀聯支付介面開發的方法。
銀聯支付,首先要注意二重要的部分:
PHP運行環境是5.4.18以上
開了擴展openssl
開發手冊上面的列子只做參考,因為基本都是錯的。你可以試著去官網下一個demo。。。注意現在銀聯開發,沒有測試密鑰提供,只能在正式環境開發
下面是我用ThinkPHP編寫的一個支付類
/**
* 銀聯支付 v0.1
* @auther:Summerdengwz7788@gmail.com;
* @date:20151202
* **/
class NetPayAction extends BaseAction{
//在類初始化方法中,引入相關類庫
public function _initialize() {
header(“Content-type:text/html;charset=utf-8”);
vendor(‘Netpay.util.common’,””,”.php”); //導入加密核心文件夾
vendor(‘Netpay.util.SecssUtil’,””,”.class.php”); //導入加密核心文件夾
vendor(‘Netpay.util.Settings_INI’,””,”.php”); //導入加密核心文件夾
vendor(‘Netpay.util.Settings’,””,”.php”); //導入加密核心文件夾
$this-securityPropFile= $_SERVER[‘DOCUMENT_ROOT’] . “/ThinkPHP/Extend/Vendor/Netpay/config/security.properties”; //誰知道這是啥,反正他們要我加的
$this-b2cPaySend = __APP__.”/Index/NetPay/b2cPaySend”;
$this-b2cRefundSend = __APP__.”/Index/NetPay/b2cRefundSend”;
$this-b2cQuerySend = __APP__.”/Index/NetPay/b2cQuerySend”;
$this-;MerBgUrl = __APP__.”/Index/NetPay/MerBgUrl”;
$this-MerPageUrl = __APP__.”/Index/NetPay/MerPageUrl”;
}
public function index()
{
$paramArray=array (
‘MerId’ = ‘商戶號’,
‘MerOrderNo’ = ‘0000001944663232’,
‘OrderAmt’ = ‘1’,
‘TranDate’ = ‘20151219’,
‘TranTime’ =’171248′,
‘TranType’ = ‘0001’,
‘BusiType’ =’0001′,
‘Version’ = ‘20140728’,
‘CurryNo’ = ‘CNY’,
‘AccessType’ =; ‘0’,
‘CommodityMsg’ = ‘測試商品1號’,
‘MerPageUrl’ = $this-MerBgUrl,
‘MerBgUrl’ =$this-MerPageUrl,
‘MerResv’ = ‘MerResv’,
);
if (count($paramArray) 0) {
$dispatchUrl = $this-b2cPaySend;
$transResvedJson = array();
$cardInfoJson = array();
$sendMap = array();
foreach ($paramArray as $key = $value) {
if (isEmpty($value)) {
continue;
}
if (startWith($key, “trans_”)) {
$key = substr($key, strlen(“trans_”));
$transResvedJson[$key] = $value;
} else
if (startWith($key, “card_”)) {
$key = substr($key, strlen(“card_”));
$cardInfoJson[$key] = $value;
} else {
$sendMap[$key] = $value;
}
}
$transResvedStr = null;
$cardResvedStr = null;
if (count($transResvedJson) 0) {
$transResvedStr = json_encode($transResvedJson);
}
if (count($cardInfoJson) 0) {
$cardResvedStr = json_encode($cardInfoJson);
}
$secssUtil = new SecssUtil();
if (! isEmpty($transResvedStr)) {
$transResvedStr = $secssUtil-decryptData($transResvedStr);
$sendMap[“TranReserved”] = $transResvedStr;
}
if (! isEmpty($cardResvedStr)) {
$cardResvedStr = $secssUtil-decryptData($cardResvedStr);
$sendMap[“card_”] = $cardResvedStr;
}
$securityPropFile = $thissecurityPropFile;
$secssUtil-init($securityPropFile);
$secssUtil-sign($sendMap);
$sendMap[“Signature”] = $secssUtil-getSign();
$_SESSION = $sendMap;
header(“Location:” . $dispatchUrl);
}
}
public function b2cPaySend(){
layout(false);
$settings = new Settings_INI();
$settings-oad($this-securityPropFile);
$pay_url = “”;
$html = “form name=’payment’ action='{$pay_url}’ method=’POST’ target=’_blank’;”;
$params = “TranReserved;MerId;MerOrderNo;OrderAmt;CurryNo;TranDate;SplitMethod;BusiType;MerPageUrl;MerBgUrl;SplitType;MerSplitMsg;PayTimeOut;MerResv;Version;BankInstNo;CommodityMsg;Signature;AccessType;AcqCode;OrderExpiryTime;TranType;RemoteAddr;Referred;TranTime;TimeStamp;CardTranData”;
foreach ($_SESSION as $k =$v) {
if (strstr($params, $k)) {
$html .= “input type=’hidden’ name = ‘” . $k . “‘ value ='” . $v . “‘/”;
}
}
$html .= “nput type=’button’ type=’hidden’ value=’提交訂單’ “;
$html .= “;/from”;
$this-html = $html;
$this-display();
}
public function pgReturn(){
if ($_POST) {
if (count($_POST) 0) {
$secssUtil = new SecssUtil();
$securityPropFile = $thissecurityPropFile;
$secssUtil-init($securityPropFile);
$text = array();
foreach($_POST as $key=$value){
$text[$key] = urldecode($value);
}
if ($secssUtil-verify($text)) {
//支付成功
$_SESSION[“VERIFY_KEY”] = “success”;
} else {
//支付失敗
$_SESSION[“VERIFY_KEY”] = “fail”;
}
}
}
}
}
銀聯支付應該是算比較簡單的!!
PHP怎麼做銀聯的支付介面調用
PHP做銀聯支付介面調用問題
//在工商支付介面之前要找到工行提供的介面文件級dll文件
//將訂單簽名數據公鑰加密提供給工行指定頁面
//組織要簽名的數據串
$src=”ICBC_PERBANK_B2C1.0.0.0″.$infomer[“merid”].$infomer[“meracct”].$returnaddress.”HS”.$ddnumber.$amount.”0010″.$nowtime.”0″;
$com=new com(‘ICBCEBANKUTIL.B2CUtil’);
$rc=$com-init(“c:\WINDOWS\user.crt”,”c:\WINDOWS\user.crt”,”c:\WINDOWS\user.key”,”11111111″);
$ssrc=$com-signC($src, strlen($src)); //訂單簽名數據
$rc=$com-verifySignC($src,strlen($src), $ssrc, strlen($ssrc));
$cert=$com-getCert(1); //商城證書公鑰
//將商戶證書存儲到c:\WINDOWS目錄下,然後創建form表單,將指定的數據提交到工行指定的網頁中
!–支付寶支付的介面操作,提交的數據–
td width=”100″a href=”{$link}”img src=”images/sy_19.gif” width=”90″ height=”25″ border=”0″/a/td
!–——————————————————–
!–工行支付的介面操作,提交的數據–
form action=”” method=”post” name=”form_bank”
input name=”interfaceName” type=”hidden” value=”ICBC_PERBANK_B2C”/
input name=”interfaceVersion” type=”hidden” value=”1.0.0.0″/
input name=”orderid” type=”hidden” value=”{$ddnumber}”/
input name=”amount” type=”hidden” value=”{$amount}”/
input name=”curType” type=”hidden” value=”001″/
input name=”merID” type=”hidden” value=”{$merid}”/
input name=”merAcct” type=”hidden” value=”{$meracct}”/
input name=”verifyJoinFlag” type=”hidden” value=”0″/
input name=”notifyType” type=”hidden” value=”HS”/
input name=”merURL” type=”hidden” value=”{$returnaddress}”/
input name=”resultType” type=”hidden” value=”0″/
input name=”orderDate” type=”hidden” value=”{$nowtime}”/
input name=”merSignMsg” type=”hidden” value=”{$ssrc}” /
input name=”merCert” type=”hidden” value=”{$cert}” /
/form
中國銀聯在線支付介面php開發怎麼做
對方應該有sdk和demo提供的,支付介面的流程都差不多,包括支付寶,網銀,財付通,paypal等流程都一樣。
用戶下單,收集購物車內產品的總價
拼裝支付參數URL跳轉進入支付網關進行支付(這裡會用到支付網關提供的SDK)
支付成功
支付網關伺服器會非同步發送支付成功的通知到你的「通知URL」,你對過來的參數進行有效性驗證,確保是從支付網關發來的,進行業務邏輯處理,比如設置訂單完成標識等操作;
注意這不是「返回URL」,這一步操作前台支付用戶不會看到。
網關一般在完成支付後,會自動返回我們的網站,進入網站後提示用戶完成支付,並跳轉到相應頁面即可。
PHP銀聯在線支付開發怎麼自動跳轉支付成功界面
在銀聯支付回調頁面的地方 return_url 裡面, 做個支付結果判斷:
1、支付成功,則跳轉到支付成功頁面;
2、否則跳轉到支付失敗頁面就可以了。
原創文章,作者:NNUNU,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/330611.html