php银联支付最新demo,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/n/330611.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
NNUNUNNUNU
上一篇 2025-01-16 15:46
下一篇 2025-01-16 15:46

相关推荐

  • PHP和Python哪个好找工作?

    PHP和Python都是非常流行的编程语言,它们被广泛应用于不同领域的开发中。但是,在考虑择业方向的时候,很多人都会有一个问题:PHP和Python哪个好找工作?这篇文章将从多个方…

    编程 2025-04-29
  • PHP怎么接币

    想要在自己的网站或应用中接受比特币等加密货币的支付,就需要对该加密货币拥有一定的了解,并使用对应的API进行开发。本文将从多个方面详细阐述如何使用PHP接受加密货币的支付。 一、环…

    编程 2025-04-29
  • 使用PHP foreach遍历有相同属性的值

    本篇文章将介绍如何使用PHP foreach遍历具有相同属性的值,并给出相应的代码示例。 一、基础概念 在讲解如何使用PHP foreach遍历有相同属性的值之前,我们需要先了解几…

    编程 2025-04-28
  • PHP获取301跳转后的地址

    本文将为大家介绍如何使用PHP获取301跳转后的地址。301重定向是什么呢?当我们访问一个网页A,但是它已经被迁移到了另一个地址B,此时若服务器端做了301重定向,那么你的浏览器在…

    编程 2025-04-27
  • PHP登录页面代码实现

    本文将从多个方面详细阐述如何使用PHP编写一个简单的登录页面。 1. PHP登录页面基本架构 在PHP登录页面中,需要包含HTML表单,用户在表单中输入账号密码等信息,提交表单后服…

    编程 2025-04-27
  • PHP与Python的比较

    本文将会对PHP与Python进行比较和对比分析,包括语法特性、优缺点等方面。帮助读者更好地理解和使用这两种语言。 一、语法特性 PHP语法特性: <?php // 简单的P…

    编程 2025-04-27
  • C++最新标准的详细阐述

    一、auto关键字的使用 auto关键字的使用是C++11最受欢迎的新特性之一。使用auto关键字可以自动推断变量的类型,这样大大减少了代码的冗余。例如: auto i = 1; …

    编程 2025-04-25
  • PHP版本管理工具phpenv详解

    在PHP项目开发过程中,我们可能需要用到不同版本的PHP环境来试验不同的功能或避免不同版本的兼容性问题。或者我们需要在同一台服务器上同时运行多个不同版本的PHP语言。但是每次手动安…

    编程 2025-04-24
  • PHP数组去重详解

    一、array_unique函数 array_unique是php中常用的数组去重函数,它基于值来判断元素是否重复,具体使用方法如下: $array = array(‘a’, ‘b…

    编程 2025-04-24
  • PHP导出Excel文件

    一、PHP导出Excel文件列宽调整 当我们使用PHP导出Excel文件时,有时需要调整单元格的列宽。可以使用PHPExcel类库中的setWidth方法来设置单元格的列宽。下面是…

    编程 2025-04-24

发表回复

登录后才能评论