php支付宝接口用法,具体分析如下:
现在流行的网站支持平台,支付宝当仁不让的老大了,现在我们就来告诉你如何使用支付宝api来做第三方支付,把支付宝放到自己网站来,代码如下:
alipay_config.php配置程序如下:
代码如下:
?php
*/
//alipay_config.php 配置程序
$interfaceurl = ":";
$sitename = "网站名称";
$weburl = "http://网站网址";
$o_fee = "0.00"; //平邮费
$e_fee = "0.00"; //快递费
$selleremail = "";//支付宝账号
$payalikey = "";//安全校验码
$imgurl = "pay.gif"; //按钮图片源
$imgtitle = "使用支付宝购买"; //按钮图片说明
?
alipay.php代码如下:
代码如下:
?php
/*********************************************************************
filename: alipay.php
author: dboyzhang
version: ver 2.0.0 beta1
contact_me: wangwang:dboyzhang
*********************************************************************/
//alipay.php代码
require_once("alipay_config.php");
class alipay
{
function geturl($s1,$s2,$s3,$s4,$s5,$s6,$s7,$s8,$s9,$s10,$s11,$s12,$s13,$s14,$s15,$s16,$s17,$s18,$s19,$s20,$s21,$s22,$s23)
{
$parameter = array(
'cmd' = $s1,
'subject' = $s2,
'body' = $s3,
'order_no' = $s4,
'price' = $s5,
'url' = $s6,
'type' = $s7,
'number' = $s8,
'transport' = $s9,
'ordinary_fee' = $s10,
'express_fee' = $s11,
'readonly' = $s12,
'buyer_msg' = $s13,
'seller' = $s14,
'buyer' = $s15,
'buyer_name' = $s16,
'buyer_address' = $s17,
'buyer_zipcode' = $s18,
'buyer_tel' = $s19,
'buyer_mobile' = $s20,
'partner' = $s21,
);
$url = $s22.$s14."?";
foreach($parameter as $key = $value){
if($value){
$url .= $key."=".urlencode($value)."";
$acsouce .=$key.$value;
}
}
$url .= 'ac='.md5($acsouce.$s23);
return $url;
}
}
?
pay.php页面如下:
代码如下:
?php
error_reporting(0);
$aliname=$_POST["aliname"];
$alizipcode=$_POST["alizipcode"];
$aliphOne=$_POST["aliphone"];
$aliaddress=$_POST["aliaddress"];
$aliorder=$_POST["aliorder"];
$alimailtype=$_POST["alimailtype"];
$alimOney=$_POST["alimoney"];
$alimob=$_POST["alimob"];
$alibody=$_POST["alibody"];
require_once("alipay_config.php");
require_once("alipay.php");
$cmd = '0001';
$subject = "订单号:".$aliorder;
$body = '商品介绍';
$order_no = $aliorder;
$price = $alimoney;
$url = '';//你的网址
$type = '1';
$number = '1';
$transport = $alimailtype;
$ordinary_fee = '0.00';
$express_fee = '0.00';
$readOnly= 'true';
$buyer_msg = $alibody;
$seller = $selleremail;
$buyer = '';
$buyer_name = $aliname;
$buyer_address = $aliaddress;
$buyer_zipcode = $alizipcode;
$buyer_tel = $aliphone;
$buyer_mobile = $alimob;
$partner = '2088002008096997';
$geturl = new alipay;
$link = $geturl-geturl
(
$cmd,$subject,$body,$order_no,$price,$url,$type,$number,$transport,
$ordinary_fee,$express_fee,$readonly,$buyer_msg,$seller,$buyer,
$buyer_name,$buyer_address,$buyer_zipcode,$buyer_tel,$buyer_mobile,$partner,
$interfaceurl,$payalikey
);
?
html
head
title简易支付宝付款php版/title
link href="admin_style.css教程" rel=stylesheet
meta http-equiv=content-type cOntent="text/html; charset=gb2312"
/head
body
table class=border id=table1 align=center bgcolor=#ffffff
tbody
tr class=tdbg
td 订单号码:/td
td ? echo $aliorder; ?/td/tr
tr class=tdbg
td 收 货 人:/td
td ? echo $aliname; ?/td/tr
tr class=tdbg
td 付款金额:/td
td b? echo $alimoney; ?/b/td/tr
tr class=tdbg
td 收货地址:/td
td ? echo $aliaddress; ?/td/tr
tr class=tdbg
td物流方式:/td
td? echo $alimailtype; ? (1.平邮 2.快递 3.虚拟物品)/td/tr
tr class=tdbg
td联系电话:/td
td? echo $aliphone; ?/td/tr
tr class=tdbg
td邮政编码:/td
td? echo $alizipcode; ?/td/tr
tr class=tdbg
td手机号码:/td
td? echo $alimob; ?/td/tr
tr class=tdbg
td客户留言:/td
td? echo $alibody; ?/td/tr
tr class=tdbg
td/td
tdinput type="button" name="submit21" Onclick="网页特效:history.go(-1)" value="返回修改订单" a href="?php echo $link?" target="_blank"img src="?php echo $imgurl?" alt="?php echo $imgtitle?" border="0" align='absmiddle' border='0'//a /td/tr/tbody/table/td/tr/tbody/table
/body/html
php支付成功了返回fail是因为后台处理成功了,但是页面报错导致提示错误。
?php
$service = isset( $_GET [ 'service' ]) ? $_GET [ 'service' ] : 'create_direct_pay_by_user' ;
$services = array( //交易类型
'create_direct_pay_by_user' = '即时到账' ,
'create_partner_trade_by_buyer' = '担保交易' ,
);
if(! array_key_exists ( $service , $services )) exit( '错误的交易类型' );
?
p
label请选择交易类型:/label
?php foreach ( $services as $key = $val ): ?
?php if( $service == $key ): ?
b ?php echo $val ; ? /b
?php else: ?
ba href="?php echo url (array( 'service' = $key )); ? "?php echo $val ; ? /a/b
?php endif; ?
?php endforeach; ?
/p
?php
//php支付宝支付接口参数 主要如下
//(合作商户编号,加密串,返回url, 默认编码,商品名称,商品简介,商户订单号,物流配送费用)
function getRequestUrl ( $partner , $scode , $return_url , $charset , $subject , $body , $order , $lfee ) {
global $data , $service ;
# 支付宝交易类型
$data [ 'service' ] = $service ; //create_partner_trade_by_buyer[担保交易]create_direct_pay_by_user[即时到账]
# 合作商户编号
$data [ 'partner' ] = $partner ;
# 请求返回地址
$data [ 'return_url' ] = $return_url ;
# 默认编码
$data [ '_input_charset' ] = $charset ;
# 默认支付渠道
$data [ 'paymenthod' ] = 'bankPay' ;
# 默认的网银
$data [ 'defaultbank' ] = 'ICBCB2C' ;
# 商品名称
$data [ 'subject' ] = $subject ;
# 商品展示URL
$data [ 'show_url' ] = ’‘ ;
# 异步通知返回
$data [ 'notify_url' ] = ’‘ ;
# 商品简介
$data [ 'body' ] = $body ;
# 商户订单号
$data [ 'out_trade_no' ] = $order ;
# 物流配送费用
$data [ 'logistics_fee' ] = $lfee ;
# 物流费用付款方式
$data [ 'logistics_payment' ] = 'SELLER_PAY' ; //SELLER_PAY(卖家支付)、BUYER_PAY(买家支付)、BUYER_PAY_AFTER_RECEIVE(货到付款)
# 物流配送方式
$data [ 'logistics_type' ] = 'POST' ; //物流配送方式:POST(平邮)、EMS(EMS)、EXPRESS(其他快递)
# 价格
$data [ 'price' ] = '10.00' ;
#$data['total_fee'] = '10.00';
# 付款方式
$data [ 'payment_type' ] = '1' ;
# 商品数量
$data [ 'quantity' ] = '1' ;
# 卖家email
$data [ 'seller_email' ] = 'chen@sjolzy.cn' ;
$data = array_filter ( $data );
ksort ( $data ); reset ( $data );
$data [ 'sign' ] = md5 ( urldecode ( http_build_query ( $data )). $scode );
$data [ 'sign_type' ] = 'MD5' ;
$url = '?' . http_build_query ( $data );
return $url ;
}
//把支付宝接口的参数 带入进去测试
$url = getRequestUrl ( '2010101908738750' , 'ma0werwert6s2bsd1frg7hisaiaz5xjr' , '' , 'UTF-8' , '测试商品' , '测试内容' , uniqid (), '0.00' );
1、在配置文件中Conf/Config.php文件中对支付宝相关参数进行配置:
//支付宝配置参数
'alipay_config'=array(
'partner' ='20********50', //这里是你在成功申请支付宝接口后获取到的PID;
'key'='9t***********ie',//这里是你在成功申请支付宝接口后获取到的Key
'sign_type'=strtoupper('MD5'),
'input_charset'= strtolower('utf-8'),
'cacert'= getcwd().'\\cacert.pem',
'transport'= 'http',
),
//以上配置项,是从接口包中alipay.config.php 文件中复制过来,进行配置;
'alipay' =array(
//这里是卖家的支付宝账号,也就是你申请接口时注册的支付宝账号
'seller_email'='pay@xxx.com',
//这里是异步通知页面url,提交到项目的Pay控制器的notifyurl方法;
'notify_url'='',
//这里是页面跳转通知url,提交到项目的Pay控制器的returnurl方法;
'return_url'='',
//支付成功跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参payed(已支付列表)
'successpage'='User/myorder?ordtype=payed',
//支付失败跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参unpay(未支付列表)
'errorpage'='User/myorder?ordtype=unpay',
),
2、新建一个PayAction控制器代码如下:
?php
class PayAction extends Action{
//在类初始化方法中,引入相关类库
public function _initialize() {
vendor('Alipay.Corefunction');
vendor('Alipay.Md5function');
vendor('Alipay.Notify');
vendor('Alipay.Submit');
}
//doalipay方法
/*该方法其实就是将接口文件包下alipayapi.php的内容复制过来
然后进行相关处理
*/
public function doalipay(){
/*********************************************************
把alipayapi.php中复制过来的如下两段代码去掉,
第一段是引入配置项,
第二段是引入submit.class.php这个类。
为什么要去掉??
第一,配置项的内容已经在项目的Config.php文件中进行了配置,我们只需用C函数进行调用即可;
第二,这里调用的submit.class.php类库我们已经在PayAction的_initialize()中已经引入;所以这里不再需要;
*****************************************************/
// require_once("alipay.config.php");
// require_once("lib/alipay_submit.class.php");
//这里我们通过TP的C函数把配置项参数读出,赋给$alipay_config;
$alipay_cOnfig=C('alipay_config');
/**************************请求参数**************************/
$payment_type = "1"; //支付类型 //必填,不能修改
$notify_url = C('alipay.notify_url'); //服务器异步通知页面路径
$return_url = C('alipay.return_url'); //页面跳转同步通知页面路径
$seller_email = C('alipay.seller_email');//卖家支付宝帐户必填
$out_trade_no = $_POST['trade_no'];//商户订单号 通过支付页面的表单进行传递,注意要唯一!
$subject = $_POST['ordsubject']; //订单名称 //必填 通过支付页面的表单进行传递
$total_fee = $_POST['ordtotal_fee']; //付款金额 //必填 通过支付页面的表单进行传递
$body = $_POST['ordbody']; //订单描述 通过支付页面的表单进行传递
$show_url = $_POST['ordshow_url']; //商品展示地址 通过支付页面的表单进行传递
$anti_phishing_key = "";//防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数
$exter_invoke_ip = get_client_ip(); //客户端的IP地址
/************************************************************/
//构造要请求的参数数组,无需改动
$parameter = array(
"service" = "create_direct_pay_by_user",
"partner" = trim($alipay_config['partner']),
"payment_type" = $payment_type,
"notify_url" = $notify_url,
"return_url" = $return_url,
"seller_email" = $seller_email,
"out_trade_no" = $out_trade_no,
"subject" = $subject,
"total_fee" = $total_fee,
"body" = $body,
"show_url" = $show_url,
"anti_phishing_key" = $anti_phishing_key,
"exter_invoke_ip" = $exter_invoke_ip,
"_input_charset" = trim(strtolower($alipay_config['input_charset']))
);
//建立请求
$alipaySubmit = new AlipaySubmit($alipay_config);
$html_text = $alipaySubmit-buildRequestForm($parameter,"post", "确认");
echo $html_text;
}
/******************************
服务器异步通知页面方法
其实这里就是将notify_url.php文件中的代码复制过来进行处理
*******************************/
function notifyurl(){
/*
同理去掉以下两句代码;
*/
//require_once("alipay.config.php");
//require_once("lib/alipay_notify.class.php");
//这里还是通过C函数来读取配置项,赋值给$alipay_config
$alipay_cOnfig=C('alipay_config');
//计算得出通知验证结果
$alipayNotify = new AlipayNotify($alipay_config);
$verify_result = $alipayNotify-verifyNotify();
if($verify_result) {
//验证成功
//获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
$out_trade_no = $_POST['out_trade_no']; //商户订单号
$trade_no = $_POST['trade_no']; //支付宝交易号
$trade_status = $_POST['trade_status']; //交易状态
$total_fee = $_POST['total_fee']; //交易金额
$notify_id = $_POST['notify_id']; //通知校验ID。
$notify_time = $_POST['notify_time']; //通知的发送时间。格式为yyyy-MM-dd HH:mm:ss。
$buyer_email = $_POST['buyer_email']; //买家支付宝帐号;
$parameter = array(
"out_trade_no" = $out_trade_no, //商户订单编号;
"trade_no" = $trade_no, //支付宝交易号;
"total_fee" = $total_fee, //交易金额;
"trade_status" = $trade_status, //交易状态
"notify_id" = $notify_id, //通知校验ID。
"notify_time" = $notify_time, //通知的发送时间。
"buyer_email" = $buyer_email, //买家支付宝帐号;
);
if($_POST['trade_status'] == 'TRADE_FINISHED') {
//
}else if ($_POST['trade_status'] == 'TRADE_SUCCESS') { if(!checkorderstatus($out_trade_no)){
orderhandle($parameter);
//进行订单处理,并传送从支付宝返回的参数;
}
}
echo "success"; //请不要修改或删除
}else {
//验证失败
echo "fail";
}
}
/*
页面跳转处理方法;
这里其实就是将return_url.php这个文件中的代码复制过来,进行处理;
*/
function returnurl(){
//头部的处理跟上面两个方法一样,这里不罗嗦了!
$alipay_cOnfig=C('alipay_config');
$alipayNotify = new AlipayNotify($alipay_config);//计算得出通知验证结果
$verify_result = $alipayNotify-verifyReturn();
if($verify_result) {
//验证成功
//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表
$out_trade_no = $_GET['out_trade_no']; //商户订单号
$trade_no = $_GET['trade_no']; //支付宝交易号
$trade_status = $_GET['trade_status']; //交易状态
$total_fee = $_GET['total_fee']; //交易金额
$notify_id = $_GET['notify_id']; //通知校验ID。
$notify_time = $_GET['notify_time']; //通知的发送时间。
$buyer_email = $_GET['buyer_email']; //买家支付宝帐号;
$parameter = array(
"out_trade_no" = $out_trade_no, //商户订单编号;
"trade_no" = $trade_no, //支付宝交易号;
"total_fee" = $total_fee, //交易金额;
"trade_status" = $trade_status, //交易状态
"notify_id" = $notify_id, //通知校验ID。
"notify_time" = $notify_time, //通知的发送时间。
"buyer_email" = $buyer_email, //买家支付宝帐号
);
if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
if(!checkorderstatus($out_trade_no)){
orderhandle($parameter); //进行订单处理,并传送从支付宝返回的参数;
}
$this-redirect(C('alipay.successpage'));//跳转到配置项中配置的支付成功页面;
}else {
echo "trade_status=".$_GET['trade_status'];
$this-redirect(C('alipay.errorpage'));//跳转到配置项中配置的支付失败页面;
}
}else {
//验证失败
//如要调试,请看alipay_notify.php页面的verifyReturn函数
echo "支付失败!";
}
}
}
?
3、这里有几个支付处理过程中需要用到的函数,我把这些函数写到了项目的Common/common.php中,这样不用手动调用,即可直接使用这些函数,代码如下:
//////////////////////////////////////////////////////
//Orderlist数据表,用于保存用户的购买订单记录;
/* Orderlist数据表结构;
CREATE TABLE `tb_orderlist` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userid` int(11) DEFAULT NULL,购买者userid
`username` varchar(255) DEFAULT NULL,购买者姓名
`ordid` varchar(255) DEFAULT NULL,订单号
`ordtime` int(11) DEFAULT NULL,订单时间
`productid` int(11) DEFAULT NULL,产品ID
`ordtitle` varchar(255) DEFAULT NULL,订单标题
`ordbuynum` int(11) DEFAULT '0',购买数量
`ordprice` float(10,2) DEFAULT '0.00',产品单价
`ordfee` float(10,2) DEFAULT '0.00',订单总金额
`ordstatus` int(11) DEFAULT '0',订单状态
`payment_type` varchar(255) DEFAULT NULL,支付类型
`payment_trade_no` varchar(255) DEFAULT NULL,支付接口交易号
`payment_trade_status` varchar(255) DEFAULT NULL,支付接口返回的交易状态
`payment_notify_id` varchar(255) DEFAULT NULL,
`payment_notify_time` varchar(255) DEFAULT NULL,
`payment_buyer_email` varchar(255) DEFAULT NULL,
`ordcode` varchar(255) DEFAULT NULL, //这个字段不需要的,大家看我西面的修正补充部分的说明!
`isused` int(11) DEFAULT '0',
`usetime` int(11) DEFAULT NULL,
`checkuser` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
*/
//在线交易订单支付处理函数
//函数功能:根据支付接口传回的数据判断该订单是否已经支付成功;
//返回值:如果订单已经成功支付,返回true,否则返回false;
function checkorderstatus($ordid){
$Ord=M('Orderlist');
$ordstatus=$Ord-where('ordid='.$ordid)-getField('ordstatus');
if($ordstatus==1){
return true;
}else{
return false;
}
}
//处理订单函数
//更新订单状态,写入订单支付后返回的数据
function orderhandle($parameter){
$ordid=$parameter['out_trade_no'];
$data['payment_trade_no'] =$parameter['trade_no'];
$data['payment_trade_status'] =$parameter['trade_status'];
$data['payment_notify_id'] =$parameter['notify_id'];
$data['payment_notify_time'] =$parameter['notify_time'];
$data['payment_buyer_email'] =$parameter['buyer_email'];
$data['ordstatus'] =1;
$Ord=M('Orderlist');
$Ord-where('ordid='.$ordid)-save($data);
}
虽然支付宝官方还未提供相关SDK,PHP确实可以实现RSA方式的签名,这点其实很重要,由于不熟悉,在遇到困难的时候,经常会不由自主地想到是否PHP不支持RSA签名,干脆用MD5得了,这样就没有了前进的动力。其实说穿了MD5和RSA签名,不同的只是签名方式的区别,其他的都一样,因此我这里主要说一下如何用RSA进行签名和验签。
首先你需要准备下面的东西:
php的openssl扩展里已经封装好了验签的方法openssl_verify。
如果在Windows下的php.ini需要开启Openssl模块: extension=php_openssl.dll
商户私钥:
即RSA私钥,按照手册,按以下方式生成:
openssl genrsa -out rsa_private_key.pem 1024
商户公钥:
即RSA私钥,按照手册,按以下方式生成:
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
生成之后,按照手册的说明,需要在签约平台上传公钥,需要注意的是,上传的时候需要把所有的注释和换行都去掉。
另外手册中还有如下命令:
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
该命令将RSA私钥转换成PKCS8格式,对于PHP来说,不需要。
支付宝公钥:
根据手册,在签约平台获得。
如果你直接复制下来的话,会得到一个字符串,需要进行下面的转换;
1)把空格变成换行
2)添加注释
比如你复制下来的公钥是:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRBMjkaBznjXk06ddsL751KyYt
ztPFg0D3tu7jLqCacgqL+lbshIaItDGEXAMZmKa3DV6Wxy+l48YMo0RyS+dWze4M
UmuxHU/v6tiT0ZTXJN3EwrjCtCyyttdv/ROB3CkheXnTKB76reTkQqg57OWW+m9j
TCoccYMDXEIWYTs3CwIDAQAB,那转换之后为:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRBMjkaBznjXk06ddsL751KyYt
ztPFg0D3tu7jLqCacgqL+lbshIaItDGEXAMZmKa3DV6Wxy+l48YMo0RyS+dWze4M
UmuxHU/v6tiT0ZTXJN3EwrjCtCyyttdv/ROB3CkheXnTKB76reTkQqg57OWW+m9j
TCoccYMDXEIWYTs3CwIDAQAB
-----END PUBLIC KEY-----
把公钥保存在文件里。
注意这个是2048位的公钥应该是9行或者10行,不能为1行,不然PHP的openssl_pkey_get_public无法读取,pub_key_id的结果为false,如果没有-----BEGIN PUBLIC KEY----- 和 -----END PUBLIC KEY----- 可以自己加上,最后保存到一个rsa_public_key.pem文件中。
好了,现在已经有了所有的东西,先看签名函数:
1 ?php
2 /**
3 * 签名字符串
4 * @param $prestr 需要签名的字符串
5 * return 签名结果
6 */
7 function rsaSign($prestr) {
8 $public_key= file_get_contents('rsa_private_key.pem');
9 $pkeyid = openssl_get_privatekey($public_key);
10 openssl_sign($prestr, $sign, $pkeyid);
11 openssl_free_key($pkeyid);
12 $sign = base64_encode($sign);
13 return $sign;
14 }
15 ?
注意点:
1.$prestr的内容和MD5一样(参见手册,但不包含最后的MD5密码)
2.签名用商户私钥
3.最后的签名,需要用base64编码
4.这个函数返回的值,就是这次请求的RSA签名。
验签函数:
1 ?php
2 /**
3 * 验证签名
4 * @param $prestr 需要签名的字符串
5 * @param $sign 签名结果
6 * return 签名结果
7 */
8 function rsaVerify($prestr, $sign) {
9 $sign = base64_decode($sign);
10 $public_key= file_get_contents('rsa_public_key.pem');
11 $pkeyid = openssl_get_publickey($public_key);
12 if ($pkeyid) {
13 $verify = openssl_verify($prestr, $sign, $pkeyid);
14 openssl_free_key($pkeyid);
15 }
16 if($verify == 1){
17 return true;
18 }else{
19 return false;
20 }
21 }
22 ?
注意点:
1.$prestr的内容和MD5一样(参见手册)
2.$sign是支付宝接口返回的sign参数用base64_decode解码之后的二进制
3.验签用支付宝公钥
4.这个函数返回一个布尔值,直接告诉你,验签是否通过
支付宝官方提供的PHP版SDK demo中只对MD5加密方式进行了处理,但android 端和ios端 请求支付宝加密方式只能用RSA加密算法,这时服务端PHP就无法验证签名了,所以需要对demo进行一些修改。
1、修改alipay_notify.class.php文件
verifyNotify 函数第46行
$isSign = $this-getSignVeryfy($_POST, $_POST["sign"]);
改成
$isSign = $this-getSignVeryfy($_POST, $_POST["sign"], $_POST["sign_type"]);
verifyReturn 函数第83行
$isSign = $this-getSignVeryfy($_GET, $_GET["sign"]);
改成
$isSign = $this-getSignVeryfy($_GET, $_GET["sign"], $_GET["sign_type"]);
getSignVeryfy 函数 116行
function getSignVeryfy($para_temp, $sign) {
改成
function getSignVeryfy($para_temp, $sign, $sign_type) {
getSignVeryfy 函数 127行
switch (strtoupper(trim($this-alipay_config['sign_type']))) {
case "MD5" :
$isSgin = md5Verify($prestr, $sign, $this-alipay_config['key']);
break;
default :
$isSgin = false;
}
改成
switch (strtoupper(trim($sign_type))) {
case "MD5" :
$isSgin = md5Verify($prestr, $sign, $this-alipay_config['key']);
break;
case "RSA" :
$isSgin = rsaVerify($prestr, $sign);
break;
default :
$isSgin = false;
}
2、新建一个alipay_rsa.function.php文件
1 ?php
2 /* *
3 * RSA
4 * 详细:RSA加密
5 * 版本:3.3
6 * 日期:2014-02-20
7 * 说明:
8 * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
9 * 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
10 */
11 /**
12 * 签名字符串
13 * @param $prestr 需要签名的字符串
14 * return 签名结果
15 */
16 function rsaSign($prestr) {
17 $public_key= file_get_contents('rsa_private_key.pem');
18 $pkeyid = openssl_get_privatekey($public_key);
19 openssl_sign($prestr, $sign, $pkeyid);
20 openssl_free_key($pkeyid);
21 $sign = base64_encode($sign);
22 return $sign;
23 }
24 /**
25 * 验证签名
26 * @param $prestr 需要签名的字符串
27 * @param $sign 签名结果
28 * return 签名结果
29 */
30 function rsaVerify($prestr, $sign) {
31 $sign = base64_decode($sign);
32 $public_key= file_get_contents('rsa_public_key.pem');
33 $pkeyid = openssl_get_publickey($public_key);
34 if ($pkeyid) {
35 $verify = openssl_verify($prestr, $sign, $pkeyid);
36 openssl_free_key($pkeyid);
37 }
38 if($verify == 1){
39 return true;
40 }else{
41 return false;
42 }
43 }
44 ?