ホームページ  >  記事  >  バックエンド開発  >  .NET Alipay アプリの支払いアクセスの分析例

.NET Alipay アプリの支払いアクセスの分析例

黄舟
黄舟オリジナル
2018-05-11 15:01:003436ブラウズ

1. はじめに

最近新商品の準備で忙しく、ブログの更新が遅れております。ユーザーの支払いを容易にするために、新製品では Alipay に QR コードをスキャンしてアクセスする必要があります。その仕事は私に降りかかりました。この製品は、Windows システム上のデスクトップ ソフトウェアであり、ソフトウェアは支払い用の QR コードを生成します。インターフェイスはネイティブ MVVM で記述されており、これを実行した経験のあるベテラン ドライバーはクリックするだけで閉じることができます。

2. アプリケーションインターフェイス

インターフェイスの申請が最初のステップです。最初にいくつかのことがあります:

  1. その会社はAlipayアカウントを持っています

  2. 会社は営業資格を持っています(戯言)

  3. アプリケーションを作成し、コンピューターのウェブサイト支払い、モバイル支払い、アプリ支払いにサインアップします。

  4. 秘密鍵、公開鍵、Alipay公開鍵を作成します

  5. ゲートウェイとコールバックアドレスを設定する

注意すべき点は次のとおりです。 アプリケーションを作成するときは、「 「支払い」または「支払い」などの名前を付ける場合は、写真は高画質であることをお勧めします

  1. アプリケーションを作成するときは、署名してください支払いには、ビジネス資格用の写真、会社の写真 4 枚、アプリケーションの紹介 (名前、ダウンロード アドレス、アプリケーションが企業 Web サイトで入手可能かどうか、アプリケーションに表示される Alipay 支払いのインターフェイス スタイルなど) などのいくつかの申請資料が必要です。 )

  2. 契約書に署名した後、審査が必要で、承認された場合は約1日かかります(Alibabaは非常に速く、Tencent WeChatは4日かかります)。リンクが記載されたメールが送信されますので、リンクをクリックして署名を完了してください

  3. に公式ツールがあります。 Alipay インターフェース Web サイト、ダウンロードして使用するだけです
  4. ゲートウェイとコールバック アドレスが会社の Web サイトに関連していない場合、ゲートウェイとコールバック アドレスは第 2 レベルのドメイン名など、会社の Web サイトに関連付けられている必要があります。機能しません。 3. コードの流れ

には3つの構成要素があります。クライアント ソフトウェア、マーチャント サーバー バックエンド、Alipay バックエンド 「Pay QR コードを取得」をクリックします有料 QR コードを取得するには:

クライアントからの必要な情報の一部は、販売者の注文を形成するための販売者サーバーのバックエンド

        /// <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                }
            }
        }
ここでの委任メソッドは、この「api/AlipayForProduct」から開始するときに QR コードを生成するために使用されます/GetQRCodeString" はいくつかの文字列 (結果) を返します。たとえば、次のように返されます: "http://xxx.xxx.com/AlipayForProduct/SendInfoToAlipay?ordernumber=" + $" {ordernumber} "; (ordernumber は販売者の注文番号) そして、thoughtworks.qrcode.dll を使用して QRR
        /// <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;
        }
E を生成します ユーザーが Alipay アプリを使用してこの QR コードをスキャンすると、API が文字列から画像に変わります。彼は次の API をリクエストします: ?ordernumber=" + $"{orderNumber}"; (orderNumber は販売者の注文番号です)

          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;
        }

 

以上が.NET Alipay アプリの支払いアクセスの分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。