日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

getPrepayId php,获取到 prepay_id 后将参数再次签名传输给 APP 发起支付

發布時間:2023/12/14 php 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 getPrepayId php,获取到 prepay_id 后将参数再次签名传输给 APP 发起支付 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

獲取到 prepay_id 后將參數再次簽名傳輸給 APP 發起支付。

相信有不少同學因為看到統一下單返回的結果中有 sign 字段,會直接將結果返回給 APP 端,結果 APP 端沒辦法調起微支付。其實需要對 APP 端用到的字段數據按 “統一下單的簽名方式” 簽名后得到的 sign,才是 APP 端需要的 sign。

微信支付 App支付 在服務端調用統一下單接口后,服務端需要將返回的訂單數據進行二次簽名后才能返回給 App 端。開發文檔中說的并不是很明確,因為統一下單的返回數據和二簽的原數據上存在一些重疊。

微信支付服務端 sdk 提供了 WxPayResults 類,類中也的確提供了生成簽名方法,即對結果集簽名,源碼如下:

以 PHP 版為例,其他語言自行對照。

class WxPayResults extends WxPayDataBase

{

/**

* 生成簽名 - 重寫該方法

* @param WxPayConfigInterface $config 配置對象

* @param bool $needSignType 是否需要補signtype

* @return 簽名,本函數不覆蓋sign成員變量,如要設置簽名需要調用SetSign方法賦值

*/

public function MakeSign($config, $needSignType = false)

{

//簽名步驟一:按字典序排序參數

ksort($this->values);

$string = $this->ToUrlParams();

//簽名步驟二:在string后加入KEY

$string = $string . "&key=" . $config->GetKey();

//簽名步驟三:MD5加密或者HMAC-SHA256

if (strlen($this->GetSign()) <= 32) {

//如果簽名小于等于32個,則使用md5驗證

$string = md5($string);

} else {

//是用sha256校驗

$string = hash_hmac("sha256", $string, $config->GetKey());

}

//簽名步驟四:所有字符轉為大寫

$result = strtoupper($string);

return $result;

}

}

注意步驟三,是需要獲取 sign 來判斷使用什么方式生成 sign 的,是不是有種雞生蛋,蛋生雞的短路既視感。在 APP 端調起支付的參數列表的 sign 參數里有提示 “注意:簽名方式一定要與統一下單接口使用的一致”,所以這里的邏輯是要你將統一下單返回的 sign 傳遞進來,以便于統一簽名方式。簽名后一定要用真的簽名去覆蓋用來傳遞簽名方式的“簽名”。

在統一下單接口中,生成簽名的流程是 $obj->setSign() 調用 $obj->makeSign(),而后我們可以 $obj->getSign() 將簽名加到請求數據中。但在結果集類中,makeSign 卻直接調用了 getSign 來判斷使用何種方式生成簽名,所以對結果集簽名時,需確保結果集中包含了同一下單返回的 sign 字段數據,這樣結果集才能滿足 “注意:簽名方式一定要與統一下單接口使用的一致” 的要求。

所以這個類對簽名進行了重寫的目的,主要是為了保證二次簽名的簽名方式與統一下訂單的簽名方式一致,將統一下單的簽名作為 sign 傳遞給

WxPayResults 然后調用 makeSign,makeSign 就能判斷出統一下單的簽名方式,與之保持一致。

統一下單成功接口返回的數據

$uniorder = array (

'appid' => 'wxd930ea5d5a258f4f',//appid

'device_info' => 'WEB',

'mch_id' => '1900000109',// 商戶id

'nonce_str' => 'g6OZoULWyliPmiPm',

'prepay_id' => 'wx12143635206473d0a53e80f14278847815',

'result_code' => 'SUCCESS',

'return_code' => 'SUCCESS',

'return_msg' => 'OK',

'sign' => 'E91035CA24EDF115374BD2B4C4F9B419',//統一下單的簽名

'trade_type' => 'APP',

)

服務端需要二簽的數據

package 暫填寫固定值Sign=WXPay

noncestr 并不一定要統一下單返回的 nonce_str,自己生成 32位 的也可以

timestamp 自己生成即可

sign 傳遞統一下單返回的簽名,以使得結果集簽名和統一下單簽名方式一致(或者你清楚的知道你對結果集簽名的方式同下單的一致)

如果自己寫,二不用 sdk 的話,我們需要對

// 傳遞的數據

$app_result = array (

'appid' => $uniorder['appid'],//從統一下單的結果中取

'partnerid' => $uniorder['mch_id'],//從統一下單的結果中取

'prepayid' => $uniorder['prepay_id'],//從統一下單的結果中取

'package' => 'Sign=WXPay',//自己寫

'noncestr' => WxPayApi::getNonceStr();,//自己寫

'timestamp ' => time(),//自己寫

);

// 與統一下單的簽名方式一致即可

$sign = signMethodConsistWithUniOrder($app_result);

$app_result['sign'] = $sign;

// 返回給 APP 端

return $$app_result;

如果用 sdk 的務必要將 統一下單返回的數據里的簽名 sign 也傳遞給 WxPayResults 類,已使得保證簽名方式一致

// 傳遞的數據

// 傳遞的數據

$app_result = array (

'appid' => $uniorder['appid'],//從統一下單的結果中取

'partnerid' => $uniorder['mch_id'],//從統一下單的結果中取

'prepayid' => $uniorder['prepay_id'],//從統一下單的結果中取

'sign' => $uniorder['sign'],//用來使結果集簽名方式與統一下單簽名方式一致

'package' => 'Sign=WXPay',//自己寫

'noncestr' => WxPayApi::getNonceStr();,//自己寫

'timestamp ' => time(),//自己寫

);

$wxPayResults = new WxPayResults();

// 構建 WxPayResults 對象

$wxPayResults->FromArray($app_result);

// 真正的返回數據的簽名 覆蓋用來統一簽名方式的“簽名”

$app_result['sign'] = $wxPayResults->makeSign($wxPayConfig);//然后更新成二簽后的sign

// 返回給 APP 端

return $$app_result;

App 端調用微信支付的方式為

IWXAPI api;

PayReq request = new PayReq();

request.appId = "wxd930ea5d5a258f4f";

request.partnerId = "1900000109";

request.prepayId= "1101000000140415649af9fc314aa427",;

request.packageValue = "Sign=WXPay";

request.nonceStr= "1101000000140429eb40476f8896f4c9";

request.timeStamp= "1398746574";

request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B";

api.sendReq(request);

使用服務端提供的數據發起支付請求即可。

總結

以上是生活随笔為你收集整理的getPrepayId php,获取到 prepay_id 后将参数再次签名传输给 APP 发起支付的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。