Maison > développement back-end > Tutoriel C#.Net > Exemple d'analyse de l'accès au paiement de l'application .NET Alipay

Exemple d'analyse de l'accès au paiement de l'application .NET Alipay

黄舟
Libérer: 2018-05-11 15:01:00
original
3480 Les gens l'ont consulté

1. Avant-propos

 Récemment aussi Je suis tellement occupé avec les nouveaux produits que mon blog se met à jour très lentement. Afin de faciliter le paiement des utilisateurs, les nouveaux produits nécessitent qu'Alipay scanne le code QR pour y accéder. Le travail m'est tombé dessus. Le produit est un logiciel de bureau sous système Windows et le logiciel génère un code QR pour le paiement. L'interface est écrite en MVVM natif. Le processus de base est décrit ci-dessous. Les pilotes vétérans qui l'ont fait peuvent simplement cliquer pour la fermer.

2.Interface de l'application

     Postuler à une interface est le première étape, tout d'abord, il y a quelques choses :

  1. La société possède un compte Alipay

  2. L'entreprise a des qualifications commerciales (non-sens)

  3. Créez une application, inscrivez-vous pour le paiement sur site Web informatique, le paiement mobile et le paiement par application.

  4. Créer un compte privé Clé, clé publique, clé publique Alipay

  5. Configurer la passerelle et l'adresse de rappel

Les éléments à noter sont les suivants :

  1. Lors de la création d'une application, le nom ne doit pas contenir de mots tels que « paiement » ou « payer », et des images haute définition sont recommandées

  2. Lors de la création d'une candidature, paiement du contrat nécessite certains documents de candidature, tels que : des photos de qualification d'entreprise, 4 photos d'entreprise, une présentation de l'application (nom, adresse de téléchargement, si l'application est disponible sur le site Web de l'entreprise et le style d'interface du paiement Alipay apparaît dans l'application)

  3. Après la signature du contrat, il doit être examiné, ce qui prend environ un jour (Alibaba est très rapide, Tencent WeChat prend 4 jours), s'il est approuvé, un e-mail avec un lien sera envoyé. Cliquez sur le lien pour terminer le contrat

  4. Créer une clé privée, une clé publique et une clé publique Alipay clé Il existe des outils officiels sur le site de l'interface Alipay Vous pouvez les télécharger et les utiliser.

  5. La passerelle et l'adresse de rappel doivent être associées au site Web de l'entreprise, comme un nom de domaine de deuxième niveau si ; la passerelle, l'adresse de rappel et le site Web de l'entreprise n'ont pas de connexion, j'ai donc peur que cela ne fonctionne pas.

3. Flux de code

 Il y a trois éléments constitutifs. Logiciel client, backend serveur marchand, backend Alipay

Cliquez sur "Obtenir le code QR de paiement" sur le logiciel client pour obtenir un code QR payant :

Encapsulez certaines informations nécessaires du client et envoyez-les au backend du serveur marchand pour former un marchand commander

        /// <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                }
            }
        }
Copier après la connexion

La méthode déléguée ici est utilisée pour générer un code QR Lorsque vous renvoyez des chaînes (résultat) à partir de ce "api/AlipayForProduct/GetQRCodeString", par exemple, le retour est :

                                                                                     Numéro de commande du marchand)

Utilisez ensuite ThoughtWorks.QRCode.dll pour générer le code QR

comme ça Le code QR est généré. Pour parler franchement, il change l'API d'un service d'une chaîne en une image lorsque l'utilisateur utilise l'application Alipay pour scanner le code QR. , l'API sera demandée :
        /// <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;
        }
Copier après la connexion

 

"http://xxx.xxx.com/AlipayForProduct/SendInfoToAlipay?ordernumber=" + $"{ orderNumber}" ; (orderNumber est le numéro de commande du commerçant)

          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 +
Copier après la connexion

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

  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,  (
Copier après la connexion

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

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;
        }
Copier après la connexion

 

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal