视频一区二区三区自拍_千金肉奴隷1985未删减版在线观看_国产成人黄色视频在线播放_少女免费播放片高清在线观看_国产精品v欧美精品v

Login expired. Please log in again.

Feedback

0/300

Feedback

Submitted successfully

ok

Feedback

Network exception, please try again later

ok

簽名驗簽FAQ

V2接口和V3接口的簽名方式一樣嗎?

不一樣。
V2版本接口的簽名方式為MD5或HMAC-SHA256。
V3版本接口的簽名方式為非對稱密鑰SHA256-RSA。

為什么微信支付的回調(diào)缺少簽名的幾個HTTP頭?

微信支付的回調(diào),在HTTP頭部包含了以下四個HTTP頭:
1、Wechatpay-Timestamp
2、Wechatpay-Nonce
3、Wechatpay-Singature
4、Wechatpay-Serial某些代理服務器或CDN服務提供商,轉(zhuǎn)發(fā)時會“過濾“微信支付擴展的HTTP頭,會導致驗簽的應用層無法取到微信支付的簽名信息。遇到這種情況時,建議商戶調(diào)整代理服務器配置,或者通過直連的方式接受微信支付的回調(diào)。

Http頭缺少Accept或User-Agent

該報錯是因為基礎規(guī)則設置錯誤導致,Accept和User-Agent都必須設置,缺一不可。
1、Accept的設置參考以下設置:
Content-Type: application/json
Accept: application/json
2、User-Agent的設置參考如下:
HTTP協(xié)議要求發(fā)起請求的客戶端在每一次請求中都使用HTTP頭? User-Agent來標識自己。微信支付建議調(diào)用方選用以下兩種方式的一種:
A、使用HTTP客戶端默認的 User-Agent。
B、遵循HTTP協(xié)議,使用自身系統(tǒng)和應用的名稱和版本等信息,組成自己獨有的User-Agent。
注意:
1、該報錯內(nèi)容只存在于V3接口
2、微信支付API V3很可能會拒絕處理無User-Agent 的請求。

如何在程序中加載私鑰?

推薦使用微信支付提供的SDK。你也可以查看下列編程語言的示例代碼。

/**
  * 獲取私鑰。
  *
  * @param filename 私鑰文件路徑  (required)
  * @return 私鑰對象
  */
public static PrivateKey getPrivateKey(String filename) throws IOException {

  String content = new String(Files.readAllBytes(Paths.get(filename)), "utf-8");
  try {
    String privateKey = content.replace("-----BEGIN PRIVATE KEY-----", "")
        .replace("-----END PRIVATE KEY-----", "")
        .replaceAll("\\s+", "");

    KeyFactory kf = KeyFactory.getInstance("RSA");
    return kf.generatePrivate(
        new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey)));
  } catch (NoSuchAlgorithmException e) {
    throw new RuntimeException("當前Java環(huán)境不支持RSA", e);
  } catch (InvalidKeySpecException e) {
    throw new RuntimeException("無效的密鑰格式");
  }
}
/**
* Read private key from file
*
* @param string    $filepath     PEM encoded private key file path
* 
* @return resource|bool     Private key resource identifier on success, or FALSE on error
*/
public static function getPrivateKey($filepath) {
    return openssl_get_privatekey(file_get_contents($filepath));
}
protected string sign(string message)
{
    // 需去除私鑰文件中的-----BEGIN/END PRIVATE KEY-----
    string privateKey = "MIIEvgIBADANBgkqhkiG...30HBe+GD1tntZgf6I1Y0ZpHZ";
    byte[] keyData = Convert.FromBase64String(privateKey);
    using (CngKey cngKey = CngKey.Import(keyData, CngKeyBlobFormat.Pkcs8PrivateBlob))
    using (RSACng rsa = new RSACng(cngKey))
    {
        byte[] data = System.Text.Encoding.UTF8.GetBytes(message);
        return Convert.ToBase64String(rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1));
    }
}
package main
import (
  "crypto/x509"
  "encoding/pem"
  "fmt"
  "log"
)

func main() {
  var pemData = []byte(`
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC1yhh6LNB8nXmOSxdGKWmDh0OxAM/wnGyHKSD9tcEhMQTe+wabce0POXzejCmwFBzZa7ZmxH5LoAeyT7Fpwb7pptbbDx58CxCYhNEdQ2XrFILUCq3daMj++KQlyDp8U0NspFKsO57gSlihAJ49DzcXQb7Vs5daIvtLapIouPyixAE5uDL+afmJ+bXC11xP5sPWw1RfXynW3vbEyfRol9hQyQWfmO15GSZi6TTAhTKaW31yKaQNChy06K+LsE9JAU+ESxihthtGiMbY3fFRyhF9Ka2e0wIOz6UdcfwMjxXWRV4OLD1uFG9IYbUiugmYtDyIYZaFDPYdi/+Rjm10Ps5lAgMBAAECggEAb19kRZ2lEWOM8D9S//opGZrKPuvneVrsJpZtDuLGcqZMfKvALYXLnZMzzEiE1cpMrmuOMUHaukxNytGGOOupIg7D/SszGv3QahCc6Ne83hwP1wa/5DDpS0RblIYqRrbgTPQTbk+Mk48Y43K0f2YN82KlHtnLNT7PRDIDX42Nwc1X8f4JcfyKUE/pOSn+YUlu5Edu6QYbWJWS7mlojEZ/wuWbSymbs6mVVkKeSWGTIh1v4n2F3Gj6ckUDlt4aZWTVcBa2+ZvSE2h5frSH0snpdGV1bW44IqE3NkwfTQ7JI34CVJdhb3goIyoTmiz6NGEZuiyr8gP9IOjqPfeP7GO5YQKBgQDuB1CT8ksO4SqR3skRkdCQW7kOogZgDThei+3HUMOsHr8L42oYkJDmk2res1ow/mz6SoIV4w6mvvUSnACxdtYA1AzUEs3jvltv8cQ1HAuDhLRslWrhSoxrQQh20yrVxxGN0J4DdCAGURSUwypzUHR+mlfcjacPyxKUsT41+8zG+QKBgQDDg8ZGivuV794RuA3cfpitUFG+0nA0ZS3qAZqlA3ufnCudHQixFIsf83Q7sX7pBob5PNONqsbv0OKpC3/xJRSPIwjWTBUPlDLrsGajKMhUPtkWo4zkfrSa8XaUpUVDU0qTzS71f9Aab3SkPH1d1o4cQxO08axGLbmTV/46QCBzQKBgDd7ZQDXPT+epHmT4HJD9sVvW9dZVPsWmckP/MC0xqdcE1QGEjjfmablPcfjLma1J1m//Ep1vniHkkBgNJkpBgDzbHoSWAN5335ccEug2d4yFIwq19rjsY9efUaVOirSV/kiY3KSotRWGeIDC+YNHtpTx58VNZes0gvutH2Iz9ahAoGAUcoWb/xEMv0dURxF8C+lfxtSlxlBhymsg3AYWV+Tn7mdJSS4Nhv592vI/A/Mn37zh+BCP8lpX3lq2HzPEPoKF7b4Q22ggdvlSQT6SMT8mTtfbyPSyRAQdWZQZnyVkTD3TvPDg7CKD1As8KFiFuXPAD2KgI9nVz6XhNBpjZ8rbyECgYEAsOrm1hbNZbvlNhnuUjw5DTgTuJ3B0j1aK/7C2EQWR+mIG2q5TKDC6xNdszV0gK1/TbJk4RNgQo0JLkuZ2Xk2Q8KhaNe+X8SYP9CFKIsXuhGrYI5ICjipov5oJqjESV4wle575eWwdPgF1ICabpIqdnX2MxS9tkk830uXxPrXpRA=
-----END PRIVATE KEY-----`)

  block, rest := pem.Decode(pemData)
  if block == nil || block.Type != "PRIVATE KEY" {
    log.Fatal("failed to decode PEM block containing public key")
  }

  pri, err := x509.ParsePKCS8PrivateKey(block.Bytes)
  if err != nil {
    log.Fatal(err)
  }

  fmt.Printf("Got a %T, with remaining data: %q", pri, rest)
}
為什么請求返回401 Unauthorized?

請根據(jù)報文中的message信息,在下表中找到錯誤的原因和對應的解決方案。

錯誤描述 原因 解決方案
商戶未設置APIv3密鑰。 商戶未設置APIv3密鑰 請登錄商戶平臺設置APIv3密鑰
商戶未申請過證書。 商戶未申請過API證書 請參考商戶API證書說明
商戶證書序列號有誤。 使用了錯誤的商戶證書,或者使用了已經(jīng)失效的歷史的商戶證書,或者獲取的商戶證書序列號有誤 請檢查商戶證書,可登錄商戶平臺查看正確的證書序列號。
商戶證書已過期。 使用了已經(jīng)過期的商戶證書和私鑰 請到商戶平臺進行續(xù)期,使用續(xù)期后的新證書
商戶證書已作廢。 使用了商戶主動作廢的商戶證書和私鑰 請到商戶平臺重新申請證書后,使用新申請的證書
錯誤的簽名,導致驗簽失敗。 使用了錯誤的商戶私鑰,或簽名串構(gòu)造不正確 請見下一問題
Http頭Authorization值格式錯誤 缺少 Authorization頭,或其格式不正確 請檢查上送的 Authorization
Http頭Authorization認證類型不正確 不支持 Authorization中聲明的簽名算法 請檢查上送的 Authorization,目前僅支持WECHATPAY2-SHA256-RSA2048
Http頭Authorization中的timestamp與發(fā)起請求的時間不得超過5分鐘 Authorization頭中的時間戳timestamp所示時間距離當前時間超過5分鐘 請檢查系統(tǒng)時間是否準確,或者獲取時間的邏輯是否正確
已更換證書,請使用新證書 商戶主動重新申請了商戶API證書 請使用新申請的商戶API證書
如何定位“錯誤的簽名,導致驗簽失敗”的錯誤?

為了方便開發(fā)者定位,我們對于驗簽失敗,會在應答的錯誤詳情detail中加入驗簽信息。驗簽信息是我們根據(jù)商戶的HTTP請求構(gòu)造簽名串的各種信息。

1. method,HTTP請求方法

2. url,請求的URL

3. truncated_sign_message,微信支付驗簽時使用的簽名串(換行符顯示成\n)。為了方便查看,我們對最后的請求報文主體做了截斷

4. sign_message_length,微信支付驗簽時使用的簽名串的字節(jié)長度

{
"code": "SIGN_ERROR",
"message": "錯誤的簽名,驗簽失敗",
"detail": {
    "field": "signature",
    "issue": "sign not match",
    "location": "authorization",
    "sign_information": {
        "method": "GET",
        "url": "/payscore/user-service-state?service_id=500001&appid=wxeaf7bf1de621b0c2&openid=oWm9Z5JQwgV7BKAQUeKsUMVSjTpQ",
        "truncated_sign_message": "GET\n/payscore/user-service-state?service_id=500001&appid=wxeaf7bf1de621b0c2&openid=oWm9Z5JQwgV7BKAQUeKsUMVSjTpQ\n1559194069\n18a427e78d2344e1a71156a2690cc4d6\n\n",
        "sign_message_length": 157
    }
}
}

建議開發(fā)者在程序中將自己組裝的簽名串以及簽名串的字節(jié)長度在調(diào)試信息中輸出,跟微信支付返回的驗簽信息進行仔細對比,排查以下幾種常見的錯誤:

簽名串的最后一行沒有附加換行符

如果請求報文主體為空(如GET請求),最后一行應為一個換行符。

簽名串中的參數(shù),跟實際請求的參數(shù)不一致

手工拼接的URL,和實際請求發(fā)送的不一致。我們建議的實現(xiàn)是,使用HTTP庫構(gòu)造請求對象或者URL對象,再使用相應的方法取得URL。

簽名和設置Authorization頭時,使用了前后生成的兩個時間戳

簽名和設置Authorization頭時,使用了前后生成的兩個不同的隨機串。

簽名和請求時,使用了前后兩次序列化的JSON串作為請求主體。

說明
商戶的開發(fā)者可以將關(guān)鍵參數(shù)生成并保存在變量中,簽名和發(fā)送請求時統(tǒng)一使用,避免前后生成的信息不一致。

文本的編碼不一致

生成簽名串使用了非UTF-8編碼或者未設置具體編碼。

構(gòu)建簽名串順序不對

構(gòu)建簽名串沒有按照文檔要求的順序進行構(gòu)建。

使用了錯誤的商戶私鑰

開發(fā)者可以使用如下的openssl命令檢查私鑰和商戶證書中的modulus(p、q兩個大素數(shù)的乘積)是否一致。如果兩者一致,那么私鑰和證書是成對的。

$ openssl x509 -noout -modulus -in 1900009191_20180326_cert.pem
Modulus=C6D43C87B991...
$ openssl rsa -noout -modulus -in 1900009191_20180326_key.pem
Modulus=C6D43C87B991...
說明
1. modulus長度為2048位,輸出為512個字節(jié)。
2. 檢查密鑰匹配前,請先查看證書序列號,檢查是否是正確的商戶證書。
為什么微信支付的回調(diào)缺少簽名的幾個HTTP頭?

微信支付的回調(diào),在HTTP頭部包含了以下四個HTTP頭:

1. Wechatpay-Timestamp

2. Wechatpay-Nonce

3. Wechatpay-Signature

4. Wechatpay-Serial

某些代理服務器或CDN服務提供商,轉(zhuǎn)發(fā)時會“過濾”微信支付擴展的HTTP頭,會導致驗簽的應用層無法取到微信支付的簽名信息。遇到這種情況時,建議商戶調(diào)整代理服務器配置,或者通過直連的方式接受微信支付的回調(diào)。


About  WeChat  Pay

Powered By Tencent & Tenpay Copyright©

2005-2024 Tenpay All Rights Reserved.

Contact Us
Wechat Pay Global

WeChat Pay Global

置頂