php支付寶支付接口參數詳解(php對接支付接口)

本文目錄一覽:

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:26
下一篇 2024-12-12 13:26

相關推薦

  • 三星內存條參數用法介紹

    本文將詳細解釋三星內存條上面的各種參數,讓你更好地了解內存條並選擇適合自己的一款。 一、容量大小 容量大小是內存條最基本的參數,一般以GB為單位表示,常見的有2GB、4GB、8GB…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變量時顯示的指定變量類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python input參數變量用法介紹

    本文將從多個方面對Python input括號里參數變量進行闡述與詳解,並提供相應的代碼示例。 一、基本介紹 Python input()函數用於獲取用戶輸入。當程序運行到inpu…

    編程 2025-04-29
  • Spring Boot中發GET請求參數的處理

    本文將詳細介紹如何在Spring Boot中處理GET請求參數,並給出完整的代碼示例。 一、Spring Boot的GET請求參數基礎 在Spring Boot中,處理GET請求參…

    編程 2025-04-29
  • Python Class括號中的參數用法介紹

    本文將對Python中類的括號中的參數進行詳細解析,以幫助初學者熟悉和掌握類的創建以及參數設置。 一、Class的基本定義 在Python中,通過使用關鍵字class來定義類。類包…

    編程 2025-04-29
  • Hibernate日誌打印sql參數

    本文將從多個方面介紹如何在Hibernate中打印SQL參數。Hibernate作為一種ORM框架,可以通過打印SQL參數方便開發者調試和優化Hibernate應用。 一、通過配置…

    編程 2025-04-29
  • Python函數名稱相同參數不同:多態

    Python是一門面向對象的編程語言,它強烈支持多態性 一、什麼是多態多態是面向對象三大特性中的一種,它指的是:相同的函數名稱可以有不同的實現方式。也就是說,不同的對象調用同名方法…

    編程 2025-04-29
  • 全能編程開發工程師必知——DTD、XML、XSD以及DTD參數實體

    本文將從大體介紹DTD、XML以及XSD三大知識點,同時深入探究DTD參數實體的作用及實際應用場景。 一、DTD介紹 DTD是文檔類型定義(Document Type Defini…

    編程 2025-04-29
  • Java 監控接口返回信息報錯信息怎麼處理

    本文將從多個方面對 Java 監控接口返回信息報錯信息的處理方法進行詳細的闡述,其中包括如何捕獲異常、如何使用日誌輸出錯誤信息、以及如何通過異常處理機制解決報錯問題等等。以下是詳細…

    編程 2025-04-29
  • Python可變參數

    本文旨在對Python中可變參數進行詳細的探究和講解,包括可變參數的概念、實現方式、使用場景等多個方面,希望能夠對Python開發者有所幫助。 一、可變參數的概念 可變參數是指函數…

    編程 2025-04-29

發表回復

登錄後才能評論