1. はじめに
最近新商品の準備で忙しく、ブログの更新が遅れております。ユーザーの支払いを容易にするために、新製品では Alipay に QR コードをスキャンしてアクセスする必要があります。その仕事は私に降りかかりました。この製品は、Windows システム上のデスクトップ ソフトウェアであり、ソフトウェアは支払い用の QR コードを生成します。インターフェイスはネイティブ MVVM で記述されており、これを実行した経験のあるベテラン ドライバーはクリックするだけで閉じることができます。
2. アプリケーションインターフェイス
インターフェイスの申請が最初のステップです。最初にいくつかのことがあります:
その会社はAlipayアカウントを持っています
会社は営業資格を持っています(戯言)
アプリケーションを作成し、コンピューターのウェブサイト支払い、モバイル支払い、アプリ支払いにサインアップします。
秘密鍵、公開鍵、Alipay公開鍵を作成します
ゲートウェイとコールバックアドレスを設定する
注意すべき点は次のとおりです。 アプリケーションを作成するときは、「 「支払い」または「支払い」などの名前を付ける場合は、写真は高画質であることをお勧めします
アプリケーションを作成するときは、署名してください支払いには、ビジネス資格用の写真、会社の写真 4 枚、アプリケーションの紹介 (名前、ダウンロード アドレス、アプリケーションが企業 Web サイトで入手可能かどうか、アプリケーションに表示される Alipay 支払いのインターフェイス スタイルなど) などのいくつかの申請資料が必要です。 )
契約書に署名した後、審査が必要で、承認された場合は約1日かかります(Alibabaは非常に速く、Tencent WeChatは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 }
}
}
/// <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;
}
异步请求一般需要做这么几件事: 用户扫码支付完之后,支付宝后台会把所有需要验证的信息发给你,除了一个参数不需要验签完,其余都需要验签; 如果验签成功且支付状态也是成功交易后,你需要更新商户服务器后台关于此条商户订单的状态,比如将其支付状态变成已支付,填充支付时间等等; 同步请求一般需要做这么几件事: 1. 当异步调用完后,如果支付成功而且商户服务器后台对此条订单号处理也正确的话;同步请求可以再做一次验证 2. 如果验证成功,跳转支付成功页面;如果失败,跳转支付失败页面。 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 +
<, > 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, (
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 サイトの他の関連記事を参照してください。