微信中使用支付宝手机版,浏览器中打开,PHP完整综合版含回调
2018-02-17 21:48
627 查看
推荐文章 微信H5支付完整版含PHP回调页面.代码精简2018年2月
支付宝手机支付,本身有提供一个手机网站支付DEMO,是lotusphp版本的,里面有上百个文件,非常复杂.本文介绍的接口,
只需通过一个PHP文件即可实现手机支付宝接口的付款,非常简洁,并兼容微信.
代码在最下面.
注意事项(重要):
一,支付宝接口已经升级了加密方式,现在申请的接口都是公钥加私钥的加密形式.公钥与私钥都需要申请者自己生成,而且是成对的,不能拆开用.并把公钥保存到支付宝平台,该公钥对应的私钥不需要保存在支付宝,只能自己保存,并放在api支付宝接口文件中使用.下面会提到.
APPID 应该填哪个呢? 这个是指开放平台id,格式应该填2018或2016等日期开头的,不要填合作者pid,那个pid新版不需要的.APPID下面还对应一个网关.这个也要对应填写.正式申请通过的网关为https://openapi.alipay.com/gateway.do 如果你是沙箱测试账号,
则填https://openapi.alipaydev.com/gateway.do 注意区别
密钥生成方式为, https://docs.open.alipay.com/291/105971 打开这个地址,下载该相应工具后,解压打开文件夹,运行“RSA签名验签工具.bat”这个文件后.打开效果如下图
如果你的网站是jsp的,密钥格式如下图,点击选择第一个pkcs8的,如果你的网站是php,asp等,则点击pkcs1
密钥长度统一为2048位.
然后点击 生成密钥
然后,再点击打开密钥文件路径按钮.即可看到生成的密钥文件,打开txt文件.即可看到生成的公钥与私钥了.
公钥复制后(注意不要换行),需提供给支付宝账号管理者,并上传到支付宝开放平台。如下图第二
界面示例:
二,如下,同步回调地址与异步回调地址的区别.
同步地址是指用户付款成功,他自动跳转到这个地址,以get方式返回,你可以设置为跳转回会员中心,也可以转到网站首页或充值日志页面,通过$_GET 的获取支付宝发来的签名,金额等参数.然后进本地数据库验证支付是否正常.
而异步回调地址指支付成功后,支付宝会自动多次的访问你的这个地址,以静默方式进行,用户感受不到地址的跳转.注意,异步回调地址中不能有问号,&等符号,可以放在根目录中.如果你设置为notify_url.php,则你也需要在notify_url.php这个文件中做个判断.比如如果用户付款成功了.则用户的余额则增加多少,充值状态由付款中.修改为付款成功等.
三,orderName 订单名称,注意编码,否则签名可能会失败
向支付宝发起支付请求时,有个orderName 订单名称参数.注意这个参数的编码,如果你的本页面是gb2312编码,$this->charset = ‘UTF-8’这个参数最好还是UTF-8,不需要修改.否则签名时,可能会出现各种问题.,可用下面的方法做个转码.
四,微信中如何使用支付宝
支付宝有方案,可以进这个页面把ap.js及pay.htm下载后,保存到你的支付文件pay.php文件所在的目录中.
方案解释,会员在微信中打开你网站的页面,登录,并点击充值或购买链接时,他如果选择支付宝付款,则ap.js会自动弹出这个pay.htm页面,提示你在右上角选择用浏览器中打开,打开后,自动跳转到支付宝app中,不需要重新登录原网站的会员即可完成充值,并跳转回去.
注意,在你的客户从微信转到手机浏览器后,并没有让你重新登录你的商城网站,这是本方案的优势所在.
https://docs.open.alipay.com/203/105285/
五,如果你申请的支付宝手机支付接口在审核中,则可以先申请一个沙箱测试账号,该账号申请后就可以使用非常方便.同时会提供你一个支付宝商家账号及买家测试账号.登录即可测试付款情况.
代码如下(参考)
一.表单付款按钮所在页面代码
二,pay.php页面代码(核心代码)
三,回调页面案例一,即notify_url.php文件. post回调,
四.异步回调案例2, 与上面三是重复的,可选择其中一个.本回调可直接放根目录中 如果你服务器不支持mysqli 就替换为mysql 测试回调时, 请先直接访问本页面,进行测试.订单号可以先写一个固定值.
参考原文
http://blog.csdn.net/jason19905/article/details/78636716
https://github.com/dedemao/alipay
支付宝手机支付,本身有提供一个手机网站支付DEMO,是lotusphp版本的,里面有上百个文件,非常复杂.本文介绍的接口,
只需通过一个PHP文件即可实现手机支付宝接口的付款,非常简洁,并兼容微信.
代码在最下面.
注意事项(重要):
一,支付宝接口已经升级了加密方式,现在申请的接口都是公钥加私钥的加密形式.公钥与私钥都需要申请者自己生成,而且是成对的,不能拆开用.并把公钥保存到支付宝平台,该公钥对应的私钥不需要保存在支付宝,只能自己保存,并放在api支付宝接口文件中使用.下面会提到.
APPID 应该填哪个呢? 这个是指开放平台id,格式应该填2018或2016等日期开头的,不要填合作者pid,那个pid新版不需要的.APPID下面还对应一个网关.这个也要对应填写.正式申请通过的网关为https://openapi.alipay.com/gateway.do 如果你是沙箱测试账号,
则填https://openapi.alipaydev.com/gateway.do 注意区别
密钥生成方式为, https://docs.open.alipay.com/291/105971 打开这个地址,下载该相应工具后,解压打开文件夹,运行“RSA签名验签工具.bat”这个文件后.打开效果如下图
如果你的网站是jsp的,密钥格式如下图,点击选择第一个pkcs8的,如果你的网站是php,asp等,则点击pkcs1
密钥长度统一为2048位.
然后点击 生成密钥
然后,再点击打开密钥文件路径按钮.即可看到生成的密钥文件,打开txt文件.即可看到生成的公钥与私钥了.
公钥复制后(注意不要换行),需提供给支付宝账号管理者,并上传到支付宝开放平台。如下图第二
界面示例:
二,如下,同步回调地址与异步回调地址的区别.
同步地址是指用户付款成功,他自动跳转到这个地址,以get方式返回,你可以设置为跳转回会员中心,也可以转到网站首页或充值日志页面,通过$_GET 的获取支付宝发来的签名,金额等参数.然后进本地数据库验证支付是否正常.
而异步回调地址指支付成功后,支付宝会自动多次的访问你的这个地址,以静默方式进行,用户感受不到地址的跳转.注意,异步回调地址中不能有问号,&等符号,可以放在根目录中.如果你设置为notify_url.php,则你也需要在notify_url.php这个文件中做个判断.比如如果用户付款成功了.则用户的余额则增加多少,充值状态由付款中.修改为付款成功等.
$returnUrl = 'http://域名/user/h5_alipay/return_url.php'; //付款成功后的 同步回调地址,可直接设置为会员中心的地址 $notifyUrl = 'http://域名/notify_url.php'; //付款成功后的异回调地址,如果你的回调地址中包含&符号,最好把回调直接放根目录
三,orderName 订单名称,注意编码,否则签名可能会失败
向支付宝发起支付请求时,有个orderName 订单名称参数.注意这个参数的编码,如果你的本页面是gb2312编码,$this->charset = ‘UTF-8’这个参数最好还是UTF-8,不需要修改.否则签名时,可能会出现各种问题.,可用下面的方法做个转码.
$orderName=iconv("GB2312//IGNORE","UTF-8",'支付宝充值');
四,微信中如何使用支付宝
支付宝有方案,可以进这个页面把ap.js及pay.htm下载后,保存到你的支付文件pay.php文件所在的目录中.
方案解释,会员在微信中打开你网站的页面,登录,并点击充值或购买链接时,他如果选择支付宝付款,则ap.js会自动弹出这个pay.htm页面,提示你在右上角选择用浏览器中打开,打开后,自动跳转到支付宝app中,不需要重新登录原网站的会员即可完成充值,并跳转回去.
注意,在你的客户从微信转到手机浏览器后,并没有让你重新登录你的商城网站,这是本方案的优势所在.
https://docs.open.alipay.com/203/105285/
五,如果你申请的支付宝手机支付接口在审核中,则可以先申请一个沙箱测试账号,该账号申请后就可以使用非常方便.同时会提供你一个支付宝商家账号及买家测试账号.登录即可测试付款情况.
代码如下(参考)
一.表单付款按钮所在页面代码
<? include("../../config/conn.php"); include("../../config/function.php"); sesCheck_m(); ?> <html> <head> <meta http-equiv="x-ua-compatible" content="ie=7" /> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/> <title>会员中心 <?=webname?></title> <script language="javascript"> function xz(x){ document.getElementById(x).checked=true; } function tj(){ t1v=document.f1.t1.value; if(t1v.replace(/\s/,"")=="" || isNaN(t1v)){layerts("请输入充值金额");return false;} r=document.getElementsByName("R1"); rv=""; for(i=0;i<r.length;i++){if(r[i].checked==true){rv=r[i].value;}} if(rv==""){layerts("请选择支付方式");return false;} if(rv=="alipay" || rv==""){fu="h5_alipay/wappay/pay.php";} <? if ( strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') == false ) {?> else if(rv=="wxpay"){f1.action="wxpay/h5_pay.php";}//微信中,不可以使用微信h5支付.只可用公众号支付. <? }else{?> else if(rv=="wxpay"){f1.action="wxpay/wxpay_jspay_pay.php";} <? }?> tjwait(); f1.action=fu; } </script> </head> <body> <form name="f1" method="post" onSubmit="return tj()"> <input type="hidden" value="pay" name="jvs" /> <div class="d1">充值金额</div> <input type="text" name="t1" class="inp" style="font-weight:700;color:#ff6600;" value="0.01" /> <br/> <input name="R1" id="alipay" type="radio" value="alipay" /><img onClick="xz('alipay')" src="../../user/img/pay/alipay.gif" /> <br/> <input type="submit" class="tjinput" value="立即充值" /> </form> </div> </body> </html>
二,pay.php页面代码(核心代码)
<?php
header('Content-type:text/html; Charset=GB2312');
$appid = '2016091200492600'; //https://open.alipay.com 账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID
$notifyUrl = 'http://域名/user/h5_alipay/notify_url.php'; //付款成功后的异步回调地址支付宝以post的方式回调
$returnUrl = 'http://域名/user/pay_chongzhi.php'; //付款成功后,支付宝以 get同步的方式回调给发起支付方
$sj=date("Y-m-d H:i:s");
$userid=returnuserid($_SESSION["SHOPUSER"]);
$ddbh=$bh="h5_ali_".time()."_".$userid;//订单编号
$uip=$_SERVER["REMOTE_ADDR"];//ip地址
$money1=$_POST[t1];
//bz备注,ddzt与alipayzt及ifok表示订单状态,
intotable("yjcode_dingdang","bh,ddbh,userid,sj,uip,money1,ddzt,alipayzt,bz,ifok","'".$bh."','".$ddbh."',".$userid.",'".$sj."','".$uip."',".$money1.",'等待买家付款','','支付宝充值',0");//订单入库
//die(mysql_error());//数据库错误
//订单名称
$orderName=iconv("GB2312//IGNORE","UTF-8",'支付宝充值');//注意编码
$body = $orderName=iconv("GB2312//IGNORE","UTF-8",'支付宝充值');
$outTradeNo = $ddbh; //你自己的商品订单号
$payAmount = $money1; //付款金额,单位:元
$signType = 'RSA2'; //签名算法类型,支持RSA2和RSA,推荐使用RSA2
$saPrivateKey='这里填2048位的私钥';//私钥
$aliPay = new AlipayService($appid,$returnUrl,$notifyUrl,$saPrivateKey);
$payConfigs = $aliPay->doPay($payAmount,$outTradeNo,$orderName,$returnUrl,$notifyUrl);
class AlipayService
{
protected $appId;
protected $returnUrl;
protected $notifyUrl;
protected $charset;
//私钥值
protected $rsaPrivateKey;
public function __construct($appid, $returnUrl, $notifyUrl,$saPrivateKey)
{
$this->appId = $appid;
$this->returnUrl = $returnUrl;
$this->notifyUrl = $notifyUrl;
$this->charset = 'UTF-8';
$this->rsaPrivateKey=$saPrivateKey;
}
/**
* 发起订单
* @param float $totalFee 收款金额 单位元
* @param string $outTradeNo 订单号
* @param string $orderName 订单名称
* @param string $notifyUrl 支付结果通知url 不要有问号
* @param string $timestamp 订单发起时间
* @return array
*/
public function doPay($totalFee, $outTradeNo, $orderName, $returnUrl,$notifyUrl)
{
//请求参数
$requestConfigs = array(
'out_trade_no'=>$outTradeNo,
'product_code'=>'QUICK_WAP_WAY',
'total_amount'=>$totalFee, //单位 元
'subject'=>$orderName, //订单标题
);
$commonConfigs = array(
//公共参数
'app_id' => $this->appId,
'method' => 'alipay.trade.wap.pay', //接口名称
'format' => 'JSON',
'return_url' => $returnUrl,
'charset'=>$this->charset,
'sign_type'=>'RSA2',
'timestamp'=>date('Y-m-d H:i:s'),
'version'=>'1.0',
'notify_url' => $notifyUrl,
'biz_content'=>json_encode($requestConfigs),
);
$commonConfigs["sign"] = $this->generateSign($commonConfigs, $commonConfigs['sign_type']);
return $commonConfigs;
}
public function generateSign($params, $signType = "RSA") {
return $this->sign($this->getSignContent($params), $signType);
}
protected function sign($data, $signType = "RSA") {
$priKey=$this->rsaPrivateKey;
$res = "-----BEGIN RSA PRIVATE KEY-----\n" .
wordwrap($priKey, 64, "\n", true) .
"\n-----END RSA PRIVATE KEY-----";
($res) or die('您使用的私钥格式错误,请检查RSA私钥配置');
if ("RSA2" == $signType) {
openssl_sign($data, $sign, $res, version_compare(PHP_VERSION,'5.4.0', '<') ? SHA256 : OPENSSL_ALGO_SHA256); //OPENSSL_ALGO_SHA256是php5.4.8以上版本才支持
} else {
openssl_sign($data, $sign, $res);
}
$sign = base64_encode($sign);
return $sign;
}
/**
* 校验$value是否非空
* if not set ,return true;
* if is null , return true;
**/
protected function checkEmpty($value) {
if (!isset($value))
return true;
if ($value === null)
return true;
if (trim($value) === "")
return true;
return false;
}
public function getSignContent($params) {
ksort($params);
$stringToBeSigned = "";
$i = 0;
foreach ($params as $k => $v) {
if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) {
// 转换成目标字符集
$v = $this->characet($v, $this->charset);
if ($i == 0) {
$stringToBeSigned .= "$k" . "=" . "$v";
} else {
$stringToBeSigned .= "&" . "$k" . "=" . "$v";
}
$i++;
}
}
unset ($k, $v);
return $stringToBeSigned;
}
/**
* 转换字符集编码
* @param $data
* @param $targetCharset
* @return string
*/
function characet($data, $targetCharset) {
if (!empty($data)) {
$fileType = $this->charset;
if (strcasecmp($fileType, $targetCharset) != 0) {
$data = mb_convert_encoding($data, $targetCharset, $fileType);
}
}
return $data;
}
}
function isWeixin(){
if ( strpos($_SERVER['HTTP_USER_AGENT'],'MicroMessenger') !== false ) {
return true;
}
return false;
}
$queryStr = http_build_query($payConfigs);
if(isWeixin()):
//注意下面的ap.js ,文件的存在目录,如果不确定.可以写绝对地址.否则可能微信中没法弹出提示窗口,
?>
<script type="text/javascript" src="ap.js"></script>
<script>
var gotoUrl = 'https://openapi.alipaydev.com/gateway.do?<?=$queryStr?>';
//注意上面及下面的alipaydev.com,用的是沙箱接口,去掉dev表示正式上线
_AP.pay(gotoUrl);
</script>
<?php
else:
//print_r(($orderName.$body));exit;
header("Location:https://openapi.alipaydev.com/gateway.do?{$queryStr}");
endif;
?>
三,回调页面案例一,即notify_url.php文件. post回调,
<?php header('Content-type:text/html; Charset=GB2312'); //支付宝公钥,账户中心->密钥管理->开放平台密钥,找到添加了支付功能的应用,根据你的加密类型,查看支付宝公钥 $alipayPublicKey=''; $aliPay = new AlipayService($alipayPublicKey); //验证签名,如果签名失败,注意编码问题.特别是有中文时,可以换成英文,再测试 $result = $aliPay->rsaCheck($_POST,$_POST['sign_type']); if($result===true){ //处理你的逻辑,例如获取订单号$_POST['out_trade_no'],订单金额$_POST['total_amount']等 //程序执行完后必须打印输出“success”(不包含引号)。如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h); $out_trade_no = $_POST['out_trade_no']; //支付宝交易号 $trade_no = $_POST['trade_no']; //交易状态 $trade_status = $_POST['trade_status']; switch($trade_status){ case "WAIT_BUYER_PAY"; $nddzt="等待买家付款"; break; case "TRADE_FINISHED": case "TRADE_SUCCESS"; $nddzt="交易成功"; break; } if(empty($trade_no)){echo "success";exit;} //注意,这里的查询不能 强制用户登录,则否支付宝没法进入本页面.没法通知成功 $sql="select ifok,jyh from yjcode_dingdang where ifok=1 and jyh='".$trade_no."'";mysql_query("SET NAMES 'GBK'");$res=mysql_query($sql);//支付宝生成的流水号 if($row=mysql_fetch_array($res)){echo "success";exit;} $sql="select * from yjcode_dingdang where ddbh='".$out_trade_no."' and ifok=0 and ddzt='等待买家付款'"; mysql_query("SET NAMES 'GBK'"); $res=mysql_query($sql); if($row=mysql_fetch_array($res)){ if(1==$row['ifok']){echo "success";exit;} if($trade_status=="TRADE_SUCCESS" || $trade_status=="TRADE_FINISHED"){ if($row['money1']== $_POST['total_fee'] ){ $sj=time();$uip=$_SERVER["REMOTE_ADDR"]; updatetable("yjcode_dingdang","sj='".$sj."',uip='".$uip."',alipayzt='".$trade_status."',ddzt='".$nddzt."',ifok=1,jyh='".$trade_no."' where id=".$row[id]); $money1=$row["money1"];//修改订单状态为成功付款 PointIntoM($userid,"支付宝充值".$money1."元",$money1);//会员余额增加 echo "success";exit; } } } //——请根据您的业务逻辑来编写程序(以上代码仅作参考)—— echo 'success';exit(); } echo 'fail';exit(); class AlipayService { //支付宝公钥 protected $alipayPublicKey; protected $charset; public function __construct($alipayPublicKey) { $this->charset = 'utf8'; $this->alipayPublicKey=$alipayPublicKey; } /** * 验证签名 **/ public function rsaCheck($params) { $sign = $params['sign']; $signType = $params['sign_type']; unset($params['sign_type']); unset($params['sign']); return $this->verify($this->getSignContent($params), $sign, $signType); } function verify($data, $sign, $signType = 'RSA') { $pubKey= $this->alipayPublicKey; $res = "-----BEGIN PUBLIC KEY-----\n" . wordwrap($pubKey, 64, "\n", true) . "\n-----END PUBLIC KEY-----"; ($res) or die('支付宝RSA公钥错误。请检查公钥文件格式是否正确'); //调用openssl内置方法验签,返回bool值 if ("RSA2" == $signType) { $result = (bool)openssl_verify($data, base64_decode($sign), $res, version_compare(PHP_VERSION,'5.4.0', '<') ? SHA256 : OPENSSL_ALGO_SHA256); } else { $result = (bool)openssl_verify($data, base64_decode($sign), $res); } // if(!$this->checkEmpty($this->alipayPublicKey)) { // //释放资源 // openssl_free_key($res); // } return $result; } /** * 校验$value是否非空 * if not set ,return true; * if is null , return true; **/ protected function checkEmpty($value) { if (!isset($value)) return true; if ($value === null) return true; if (trim($value) === "") return true; return false; } public function getSignContent($params) { ksort($params); $stringToBeSigned = ""; $i = 0; foreach ($params as $k => $v) { if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) { // 转换成目标字符集 $v = $this->characet($v, $this->charset); if ($i == 0) { $stringToBeSigned .= "$k" . "=" . "$v"; } else { $stringToBeSigned .= "&" . "$k" . "=" . "$v"; } $i++; } } unset ($k, $v); return $stringToBeSigned; } /** * 转换字符集编码 * @param $data * @param $targetCharset * @return string */ function characet($data, $targetCharset) { if (!empty($data)) { $fileType = $this->charset; if (strcasecmp($fileType, $targetCharset) != 0) { $data = mb_convert_encoding($data, $targetCharset, $fileType); //$data = iconv($fileType, $targetCharset.'//IGNORE', $data); } } return $data; } }
四.异步回调案例2, 与上面三是重复的,可选择其中一个.本回调可直接放根目录中 如果你服务器不支持mysqli 就替换为mysql 测试回调时, 请先直接访问本页面,进行测试.订单号可以先写一个固定值.
<?php define('PHPS_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR); //$_POST['trade_no']=1; if($_POST['trade_no']){ $alipayPublicKey='MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyg8BC9UffA4ZoMl12zz';//RSA公钥,与支付时的私钥对应 $aliPay = new AlipayService2($alipayPublicKey); //验证签名 $result = $aliPay->rsaCheck($_POST,$_POST['sign_type']); //file_put_contents('333.txt',$_POST); if($result===true){ //处理你的逻辑,例如获取订单号$_POST['out_trade_no'],订单金额$_POST['total_amount']等 $out_trade_no = $_POST['out_trade_no']; //$out_trade_no = '2018022300293843964'; //支付宝交易号 $trade_no = $_POST['trade_no']; //交易状态 $trade_status = $_POST['trade_status']; //$trade_status=''; $userinfo = array(); if($trade_status=="TRADE_SUCCESS" || $trade_status=="TRADE_FINISHED"){ //ini_set('display_errors',1); //错误信息 //ini_set('display_startup_errors',1); //php启动错误信息 //error_reporting(-1); //打印出所有的 错误信息 $mysql_user=include(PHPS_PATH.'/caches/configs/database.php'); $username=$mysql_user['default']['username']; $password=$mysql_user['default']['password']; $tablepre=$mysql_user['default']['tablepre']; $database=$mysql_user['default']['database']; $con = mysqli_connect($mysql_user['default']['hostname'],$username,$password); mysqli_select_db($con,$database); $sql = ' SELECT * FROM '.$tablepre."pay_account where trade_sn='".$out_trade_no."'"; $result2=mysqli_query($con,$sql); $orderinfo=mysqli_fetch_array($result2);; $uid=$orderinfo['userid']; $sql2 = ' SELECT * FROM '.$tablepre."member where userid=".$uid; $result1=mysqli_query($con,$sql2); $userinfo=mysqli_fetch_array($result1);; if($orderinfo){ if($orderinfo['status']=='succ'){ //file_put_contents('31.txt',1); echo 'success'; mysqli_close($con); exit(); }else{ // if($orderinfo['money']== $_POST['total_amount'] ){ $money = $orderinfo['money']; $amount = $userinfo['amount'] + $money; $sql3 = ' update '.$tablepre."member set amount= ".$amount." where userid=".$uid; $result3=mysqli_query($con,$sql3); $sql4 = ' update '.$tablepre."pay_account set status= 'succ' where userid=".$uid ." and trade_sn='".$out_trade_no."'"; $result4=mysqli_query($con,$sql4); //file_put_contents('1.txt',$result4); echo 'success'; mysqli_close($con); exit(); // } } } else { echo 'success';exit(); } } echo 'success';exit(); } echo 'fail';exit(); } class AlipayService2 { //支付宝公钥 protected $alipayPublicKey; protected $charset; public function __construct($alipayPublicKey) { $this->charset = 'utf8'; $this->alipayPublicKey=$alipayPublicKey; } /** * 验证签名 **/ public function rsaCheck($params) { $sign = $params['sign']; $signType = $params['sign_type']; unset($params['sign_type']); unset($params['sign']); return $this->verify($this->getSignContent($params), $sign, $signType); } function verify($data, $sign, $signType = 'RSA') { $pubKey= $this->alipayPublicKey; $res = "-----BEGIN PUBLIC KEY-----\n" . wordwrap($pubKey, 64, "\n", true) . "\n-----END PUBLIC KEY-----"; ($res) or die('支付宝RSA公钥错误。请检查公钥文件格式是否正确'); //调用openssl内置方法验签,返回bool值 if ("RSA2" == $signType) { $result = (bool)openssl_verify($data, base64_decode($sign), $res, version_compare(PHP_VERSION,'5.4.0', '<') ? SHA256 : OPENSSL_ALGO_SHA256); } else { $result = (bool)openssl_verify($data, base64_decode($sign), $res); } // if(!$this->checkEmpty($this->alipayPublicKey)) { // //释放资源 // openssl_free_key($res); // } return $result; } /** * 校验$value是否非空 * if not set ,return true; * if is null , return true; **/ protected function checkEmpty($value) { if (!isset($value)) return true; if ($value === null) return true; if (trim($value) === "") return true; return false; } public function getSignContent($params) { ksort($params); $stringToBeSigned = ""; $i = 0; foreach ($params as $k => $v) { if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) { // 转换成目标字符集 $v = $this->characet($v, $this->charset); if ($i == 0) { $stringToBeSigned .= "$k" . "=" . "$v"; } else { $stringToBeSigned .= "&" . "$k" . "=" . "$v"; } $i++; } } unset ($k, $v); return $stringToBeSigned; } /** * 转换字符集编码 * @param $data * @param $targetCharset * @return string */ function characet($data, $targetCharset) { if (!empty($data)) { $fileType = $this->charset; if (strcasecmp($fileType, $targetCharset) != 0) { $data = mb_convert_encoding($data, $targetCharset, $fileType); //$data = iconv($fileType, $targetCharset.'//IGNORE', $data); } } return $data; } } ?>
参考原文
http://blog.csdn.net/jason19905/article/details/78636716
https://github.com/dedemao/alipay
相关文章推荐
- 微信端支付宝支付,iframe改造,解决微信中无法使用支付宝付款和弹出“长按地址在浏览器中打开”
- 一个PHP文件搞定支付宝系列之手机网站支付(兼容微信浏览器)
- 使用PHP和JavaScript判断请求是否来自微信内浏览器
- 梦行扫码付(收银台条码支付 微信钱包条码支付 支付宝二维码支付 手机APP钱包支付 PHP扫码支付 )
- PHP判断访问用户是使用PC浏览器和手机浏览器
- 使用Jquery判断是电脑或手机和微信浏览器访问
- 微信浏览器打开 点击下载app 无需提示使用浏览器打开--代码分享
- 在微信中如何接入支付宝的提示打开浏览器样式:方法二简易方法
- PHP--微信中使用支付宝--提示跳转页面的源代码
- PHP判断是否是微信打开, 浏览器打开
- 部分安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
- 微信防封系统:手机浏览器或者QQ唤起微信打开指定链接
- PHP 使用 微信JSSDK 拍照选择图片接口 利用localid预览时 安卓手机正常显示 iOS手机不显示
- PHP和js判断访问终端是否是微信浏览器手机还是电脑
- 网页中使用Frame框架-原理与实践-微信客户端直接打开支付宝页面
- 微信页面打开显示的样式与手机浏览器打开显示的样式不一样
- 【前端】使用weinre对手机、微信浏览器页面调试
- php 判断是否在微信浏览器中打开
- PHP判断手机是IOS还是Android,判断是否是微信打开