Heim >Backend-Entwicklung >C#.Net-Tutorial >Beispielanalyse des .NET Alipay App-Zahlungszugriffs

Beispielanalyse des .NET Alipay App-Zahlungszugriffs

黄舟
黄舟Original
2018-05-11 15:01:003481Durchsuche

1. Vorwort

 Vor Kurzem auch Ich bin so beschäftigt mit neuen Produkten, dass mein Blog nur sehr langsam aktualisiert wird. Um die Zahlung durch den Benutzer zu erleichtern, muss Alipay für den Zugriff auf neue Produkte den QR-Code scannen. Der Job fiel mir zu. Das Produkt ist eine Desktop-Software für Windows-Systeme und die Software generiert einen QR-Code für die Zahlung. Die Schnittstelle ist in nativem MVVM geschrieben. Der grundlegende Vorgang wird unten beschrieben.

2. Anwendungsschnittstelle

           Die Bewerbung um eine Schnittstelle ist die erster Schritt, zunächst einmal gibt es diese paar Dinge:

  1. Das Unternehmen verfügt über ein Alipay-Konto

  2. Das Unternehmen verfügt über kaufmännische Qualifikationen (Unsinn)

  3. Erstellen Sie eine Anwendung, melden Sie sich für Computer-Website-Zahlung, mobile Zahlung und App-Zahlung an.

  4. Privat erstellen Schlüssel, öffentlicher Schlüssel, öffentlicher Alipay-Schlüssel

  5. Gateway und Rückrufadresse konfigurieren

Folgendes ist zu beachten:

  1. Beim Erstellen einer Anwendung sollte der Name keine Wörter wie „Zahlung“ oder „bezahlen“ enthalten und hochauflösende Bilder werden empfohlen

  2. Beim Erstellen eines Antrags Vertragszahlung erfordert einige Bewerbungsunterlagen, wie zum Beispiel: Fotos der Geschäftsqualifikation, 4 Firmenfotos, Bewerbungsvorstellung (Name, Download-Adresse, ob die Bewerbung auf der Unternehmenswebsite verfügbar ist und der Schnittstellenstil der Alipay-Zahlung erscheint in der Bewerbung)

  3. Nach der Vertragsunterzeichnung wird es muss überprüft werden, was etwa einen Tag dauert (Alibaba ist wirklich schnell, Tencent WeChat dauert 4 Tage). Bei Genehmigung wird eine E-Mail mit einem Link gesendet. Klicken Sie auf den Link, um den Vertrag abzuschließen

  4. Erstellen Sie einen privaten Schlüssel, einen öffentlichen Schlüssel und einen öffentlichen Alipay-Schlüssel Schlüssel. Es gibt offizielle Tools auf der Alipay-Schnittstellen-Website. Sie können sie herunterladen und verwenden

  5. Das Gateway und die Rückrufadresse sollten mit der Unternehmenswebsite verknüpft sein, beispielsweise mit einem Second-Level-Domainnamen Das Gateway, die Rückrufadresse und die Unternehmenswebsite haben keine Verbindung, daher befürchte ich, dass es nicht funktionieren wird.

3. Codefluss

 Es gibt drei Bestandteile. Client-Software, Händler-Server-Backend, Alipay-Backend

Klicken Sie in der Client-Software auf „Zahlungs-QR-Code abrufen“, um einen zahlbaren QR-Code zu erhalten:

Kapseln Sie einige notwendige Informationen vom Client und senden Sie sie an das Händlerserver-Backend, um einen Händler zu bilden bestellen

        /// <summary>
        /// 获取二维码信息        /// </summary>
        /// <param name="packageClientInfo">封装信息</param>
        /// <param name="serverAddress">商户产品服务器地址</param>
        /// <returns></returns>
        public static void GetQRCodeInfo(string packageClientInfo, string serverAddress, Action<string> getQRCodeAction)
        {            if (!string.IsNullOrEmpty(packageClientInfo))
            {                try
                {
                    HttpClient httpsClient = new HttpClient
                    {
                        BaseAddress = new Uri(serverAddress),
                        Timeout = TimeSpan.FromMinutes(20)
                    };                    if (DsClientOperation.ConnectionTest(httpsClient))
                    {
                        StringContent strData = new StringContent(
                                                           packageClientInfo,
                                                           Encoding.UTF8,
                                                           RcCommonNames.JasonMediaType);                        
                                                           string PostUrl = httpsClient.BaseAddress + "api/AlipayForProduct/GetQRCodeString";
                        Uri address = new Uri(PostUrl);
                        Task<HttpResponseMessage> response = httpsClient.PostAsync(address, strData);
                        response.ContinueWith(
                            (postTask) =>
                            {                                
                            if (postTask.IsFaulted)
                                {                                    
                                throw postTask.Exception;
                                }
                                HttpResponseMessage postResponse = postTask.Result;
                                postResponse.EnsureSuccessStatusCode();                                
                                var result = postResponse.Content.ReadAsStringAsync().Result;
                                getQRCodeAction(JsonConvert.DeserializeObject<string>(result)); //注意这个委托                      
                                          return result;
                            });
                    }
                }                catch
                {                    // ignored                }
            }
        }

Die Delegate-Methode wird hier verwendet, um einen QR-Code zu generieren, wenn Sie beispielsweise einige Zeichenfolgen (Ergebnis) aus diesem „api/AlipayForProduct/GetQRCodeString“ zurückgeben. Rückgabe ist:

                                                                                        Bestellnummer des Händlers)

Dann verwenden Sie ThoughtWorks.QRCode.dll, um den QR-Code zu generieren

so Der QR-Code wird generiert, um es ganz klar auszudrücken: Es ändert die API eines Dienstes von einer Zeichenfolge in ein Bild, wenn der Benutzer die Alipay-App verwendet, um den QR-Code zu scannen , wird die API angefordert:
        /// <summary>
        /// 根据字符串得到相应的二维码        /// </summary>
        /// <param name="qrInfo"></param>
        /// <param name="productName"></param>
        /// <param name="version"></param>
        /// <returns></returns>
        public static Image CreateQRCodeImage(string qrInfo, string productName, string version)
        {            try
            {                if (!string.IsNullOrEmpty(qrInfo))
                {
                    QRCodeEncoder encoder = new QRCodeEncoder
                    {
                        QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE,
                        QRCodeScale = 4,
                        QRCodeVersion = 0,
                        QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M
                    };                    
                    //编码方式(注意:BYTE能支持中文,ALPHA_NUMERIC扫描出来的都是数字)                    
                    //大小(值越大生成的二维码图片像素越高)                    
                    //版本(注意:设置为0主要是防止编码的字符串太长时发生错误)                    
                    //错误效验、错误更正(有4个等级)
                    Image image = encoder.Encode(qrInfo, Encoding.GetEncoding("utf-8"));                    
                    string filename = $"{productName}_{version}.png";                    
                    var userLocalPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);                    
                    var docPath = Path.Combine(userLocalPath, @"YourProduct\QRCode");                    
                    if (!Directory.Exists(docPath))
                    {
                        Directory.CreateDirectory(docPath);
                    }                    string filepath = Path.Combine(docPath, filename); 
                    using (FileStream fs = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write))
                    {
                        image.Save(fs, System.Drawing.Imaging.ImageFormat.Png);
                        fs.Close();
                        image.Dispose();
                    }                    return image;
                }
            }            catch (Exception)
            {                return null;
            }            return null;
        }

 

"http://xxx.xxx.com/AlipayForProduct/SendInfoToAlipay?ordernumber=" + $"{ orderNumber}"; (orderNumber ist die Bestellnummer des Händlers)

          orderNumber = Request[ (! matchedItem = db.OrderInfoForProduct.FirstOrDefault(x => x.OrderNumber == (matchedItem !=  && matchedItem.IsPaid == 
                     alipayServerURL =  app_id = privateKeyPem = format =  version =  signType = 
                     out_trade_no = orderNumber; 
                     product_code = ; 
                     total_amount = ;  
                     subject = ; 
                     body = ; =  returnurl = $ notifyurl == =  +                                      + body +  +                                      + subject +  +                                      + out_trade_no +  +                                      + total_amount +  +                                      + product_code +  +                                     
                    requestWap.SetReturnUrl(returnurl); = pNone =  + responseWap.Body +

         异步请求一般需要做这么几件事:

  1. 用户扫码支付完之后,支付宝后台会把所有需要验证的信息发给你,除了一个参数不需要验签完,其余都需要验签;

  2. 如果验签成功且支付状态也是成功交易后,你需要更新商户服务器后台关于此条商户订单的状态,比如将其支付状态变成已支付,填充支付时间等等;

 
          <, > sPara = (sPara.Count > 
                 sign_type = Request.Form[
                 seller_id = Request.Form[]; 
                 trade_status = Request.Form[]; 
                 notify_time = Request.Form[]; 
                 app_id = Request.Form[]; 
                 out_trade_no = Request.Form[]; 
                 total_amount = Request.Form[]; 
                 receipt_amount = Request.Form[]; 
                 invoice_amount = Request.Form[]; 
                 buyer_pay_amount = Request.Form[]; 
                 body = Request.Form[]; 
                 gmt_payment = Request.Form[]; 

                 tradeGuid = 
                 isVerfied = AlipaySignature.RSACheckV1(sPara, alipayPublicKey, , sign_type,  (app_id == appID && seller_id == isTradeSuccess = .Equals(trade_status, ) || .Equals(trade_status,  (

         同步请求一般需要做这么几件事:

        1. 当异步调用完后,如果支付成功而且商户服务器后台对此条订单号处理也正确的话;同步请求可以再做一次验证

        2. 如果验证成功,跳转支付成功页面;如果失败,跳转支付失败页面。

        public ActionResult AlipayResult()
        {
            SortedDictionary<string, string> sPara = GetRequestGet();            if (sPara.Count > 0)
            {                //非验签参数
                var sign_type = Request.QueryString["sign_type"];                //接收参数并排序
                var seller_id = Request.QueryString["seller_id"]; //卖家支付宝用户号
                var app_id = Request.QueryString["app_id"]; //开发者AppId
                var out_trade_no = Request.QueryString["out_trade_no"]; //交易订单号

                var orderNumberGuid = new Guid(out_trade_no);                try
                {                    var isVerfied = AlipaySignature.RSACheckV1(sPara, alipayPublicKey, "utf-8", sign_type, false);    
                                if (isVerfied)
                    {                        if (app_id == appID && seller_id == sellerID)
                        {
                           //你的支付成功页面
                        }
                    }

                }                catch
                {
                   //你的支付失败页面
                }
            }            else
            {               //你的支付失败页面
            }            return View();
        }        /// <summary>
        /// 参数排序字典        /// </summary>
        /// <returns></returns>
        private SortedDictionary<string, string> GetRequestGet()
        {
            SortedDictionary<string, string> sArray = new SortedDictionary<string, string>();
            NameValueCollection coll = Request.QueryString;

            String[] requestItem = coll.AllKeys;            foreach (string t in requestItem)
            {
                sArray.Add(t, Request.QueryString[t]);
            }            return sArray;
        }

 

Das obige ist der detaillierte Inhalt vonBeispielanalyse des .NET Alipay App-Zahlungszugriffs. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn