支付寶 APP支付(證書)方式遇到的問題和解決辦法


最近在做支付寶的支付功能,遇到了一些問題記錄一下,方便查閱和遇到同樣問題的人;

這個錯誤遇到的應該都比較多吧;

 

 

這個問題發生的原因是:

1.私鑰是用文件路徑方式請求的(建議使用密文方式) 並且 keyFromFile = false ;

2.私鑰的獲取方式不正確 (正確的是:開發者工具生成后 -> 打開文件位置 ->私鑰);

3.獲取CSR 文件時沒注意看的話,就默認選擇了PKCS8 導致錯誤;

 

//如果使用 文件方式報錯的話,請參考下方案

1.將 開發者工具中 ->打開文件中 獲得的私鑰文件,增加頭部和尾部字符串如下方格式:

-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAhIHUPlqp26ye5kYiWYmOAcVLOliusADxzjNx/bXQFnOBNnkX+aTxOrHkiccd13EAHo10wnHiCYrxKpLS0jSL9puDdOYID1F9ZzZs9O3NN3BQpSx2zKJV4t1QjSVleUkSvXEZ9zIZvksPDOM8fMFiuJKeBsLj2eRrsRqx8GA5jUYkKzdXgyheDAM8tMdEaWJAdE4NN/HIdPg/QIwwju5Q44t9stHLB1FWoffNgyLsbFTe3LLAB25gJfVb592JUtP/hpp2ouOpa9p3hrlN8u2kFsQQb4MFLjS3pen5q6TP/FOZkIltdSnroGDnRlv81CyXG89Qoe24VhMJ/lMNKhPDjwIDAQABAoIBABVRjgQ6MfnV2/rQbdZZ+y7tvxy0B+bpP/4c6MoY5lG2Y6OP9/uCPg1jcZF5JQ4KV+HO3Z/oMMjpsZZ1r0BwWMEdD6jTbixILw8VKCHzG7cKIEvX+QM+uu45xuwKNRc3tC/8WeqnTkBpzV3myMEPxocLWfu5I0+eDYsg7Aheqad1hBuoe11fj00ZaZmmMX860sCJzPnfOTUuZs7ypF7g8dW7JJr0DcEF34ePA1SGa9GWTjzi/DdAlE+DvyPh1OiWZHfY1JVYESC/M4t+oRezRRTC7+OOvjod6JHJZw9HVw4UKhYOFTpX5awHFQoYECgYEAxZdx1luCTmG1Hfr6njA7EQl4VVihEOgrEOw6jhKc1Y/WtXk56MDkGnWdpyqpkEh3PR9eNtaF2DSBPgE1+pA1YmuGRgZCW+gvRVUavhIgkYvxxOwyP+yxAKaOwBY03qR/XsZB7v9x8X5P0cDeZWqYWR7DzK2vvWRtqcu2BkXZi8UCgYEAq60ude+y2gJ5Vb8s6zCLS+TN5s+Oamd/7qZpdrM1fPYHXH6/XftAsD9bKHCQJM2AlfaL0wIpXh8EmM0whNZ5gBE7z3Ja6l5WB4q/i5UvHEPQMJd+hEQRDJieHRkDra6eGsuHlDT6/WI/XblHUw2SbHMCawHGPz+eN7+e/5srY0MCgYBIadIsbuj4dNJ9pEdIxgA/pCrXjF2q5osx7oEfJC8aDVbwtvbEGD0AfW5Dn1z5JbWdTuumSURQEh3zbVos88C8yw8whoa3TAZW8HOWiOoqrRDzzGQ2DTZpOKFEQF8r4TlUsG/lePR3PoVeJ8LZhBFFSAMV9elcDXwrKB8TeXHayQKBgDTHRSVUz7NeV1cZMwILJofqi7KN1Ma5kwcXegzYA3WrXY/+F28ZM0X79FZ2ZJor44A3D72LSJR7DLq9OlFcbnYE1lJsYa7z2Zbv/Ps4ngcegf6uVGLtWiB5OwLPEeZvbIPoVoIl15PWhIyXzWmnHoDgyrmDDiObt1SEQKlsVuZpAoGAWnAamD63DfRc4zqmqGPTVttA84fOf+q2o7NGfhhyo0nFiZZbes5OJpB2ay81gvNYH0x84sanu2U+bGDXHRCAxKzaqByxCZV3/uKHS3l0S4c3lXwaScqbfLKUxDpqQSdI4VuxHLr4XrWW0WPi2YlbWTy3T4Y14GAgd9qPuLGMn5I=
-----END RSA PRIVATE KEY-----

 

2.

//官方skd源碼返回秘鑰base64密文
SDK源碼地址:https://openhome.alipay.com/doc/sdkDownload.resource?sdkType=NET

private static byte[] GetPem(string type, byte[] data)
{
string pem = Encoding.UTF8.GetString(data);
string header = String.Format("-----BEGIN {0}-----\\n", type); //官方這里是 \\n 請注意如果自己的秘鑰文件中有換行則改為 \r\n
string footer = String.Format("-----END {0}-----", type);
int start = pem.IndexOf(header, StringComparison.Ordinal) + header.Length;
int end = pem.IndexOf(footer, start, StringComparison.Ordinal); //如 秘鑰文件中 沒有出現 頭部和底部的(-----BEGIN RSA PRIVATE KEY----- 和  -----END RSA PRIVATE KEY-----) ,則end = -1 導致下面的  (end - start )報錯
string base64 = pem.Substring(start, (end - start));  //這里會出錯

return Convert.FromBase64String(base64);

}

 

 

 

另外如果秘鑰錯誤可能和生成時有關系,請看如下步驟

下載支付寶開發者簽名工具,具體使用方式可以參考支付寶流程;

網址:https://docs.open.alipay.com/291/106097/

注意事項:  生成CSR文件的時候,注意勾選  PKCS1 方式,(默認勾選的是 pkcs8) 這也是我沒仔細看,遇到第一個坑,導致程序一直報 私鑰格式不正確

 

然后上傳到支付寶的應用環境中;

 

 

 

 

 

 

 

 

證書文件都拷貝到自己的程序目錄中 ,在下方代碼 設置證書相關參數時 使用;

 static void Main(string[] args)
        {
            var path = AppContext.BaseDirectory + "key/";
            string APP_PRIVATE_KEY = "私鑰字符串或路徑";////注意:這里的私鑰,是從開發者工具->打開文件夾->獲取的私鑰
            //設置證書相關參數
            CertParams certParams = new CertParams
            {
                AlipayPublicCertPath = path + "appCertPublicKey_2016101900724029.crt", //支付寶公鑰證書儲存本地路徑
                AppCertPath = path + "alipayCertPublicKey_RSA2.crt", //商戶證書儲存本地路徑
                RootCertPath = path + "alipayRootCert.crt", //支付寶根證書儲存本地路徑
            };
            IAopClient client = new DefaultAopClient(
                "https://openapi.alipaydev.com/gateway.do",//支付寶網關,我這里是沙箱環境,正式環境請去除 dev
                "2016101900724029",// APPID
                APP_PRIVATE_KEY, //秘鑰 ,我這里是給的密文,如果給路徑下面的 keyFromFile 傳入 true
                "json",//請求格式
                "1.0",//版本
                "RSA2",//校驗加密方式 如果提是RSA則這里填寫RSA
                "utf-8", //請求報文的內容字符集格式
                false,//這里需要注意,如果設置為true 則 APP_PRIVATE_KEY 應為 私鑰的物理路徑  false 則應為 密文字符串
                certParams);
            //實例化具體API對應的request類,類名稱和接口名稱對應,當前調用接口名稱如:alipay.open.public.template.message.industry.modify 
            AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
            AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();//創建訂單的實體類
            model.Body = "我是測試數據";//支付內容
            model.Subject = "App支付測試DoNet"; //支付標題
            model.TotalAmount = "0.01";//價格
            model.ProductCode = "QUICK_MSECURITY_PAY";//這里是請求的方式,參看支付寶文檔
            model.OutTradeNo = "202002023test";//平台訂單號
            model.TimeoutExpress = "30m";//支付超時時間
            request.SetBizModel(model);
            AlipayTradeAppPayResponse response = client.SdkExecute(request);
            //調用成功,則處理業務邏輯
            if (response.IsError)
            {
                //
                Console.WriteLine(response.Msg);
            }
            Console.WriteLine(HttpUtility.HtmlEncode(response.Body));//這里返回的內容,就是支付寶APP拉起支付需要用到的字符串
            Console.ReadKey();

 

正常則返回一串APP支付需要用到的內容;

 

 

OVER ;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM