本文目錄一覽:
php,支付寶接口怎樣用
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 style=”font-size: 9pt” height=185 cellspacing=0
cellpadding=0 width=492 align=center border=0
tbody
tr
td class=topbg height=30
div align=centerstrong簡易支付寶付款php版/strong/div/td/tr
tr
td style=”border-left: #e4e4e4 1px solid; border-bottom: #e4e4e4 1px solid” colspan=3 height=150
table style=”font-size: 9pt” height=137 width=”100%” align=center bgcolor=#ffffff
tbody
tr class=tdbg
td width=”14%”訂單號碼:/td
td width=”86%”? echo $aliorder; ?/td/tr
tr class=tdbg
td width=”14%”收 貨 人:/td
td width=”86%”? echo $aliname; ?/td/tr
tr class=tdbg
td width=”14%”付款金額:/td
td width=”86%”b? echo $alimoney; ?/b/td/tr
tr class=tdbg
td width=”14%”收貨地址:/td
td width=”86%”? 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支付成功了返回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 style=”border:2px dotted blue;width:auto;”
label請選擇交易類型:/label
?php foreach ( $services as $key = $val ): ?
?php if( $service == $key ): ?
b style=”color:red”?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’ );
thinkPHP框架的項目怎麼做支付寶支付功能
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);
}
php 支付寶接口官方給的md5簽名版本和rsa簽名版本的區別
雖然支付寶官方還未提供相關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 ?
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/248224.html