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 :
La société possède un compte Alipay
-
L'entreprise a des qualifications commerciales (non-sens)
Créez une application, inscrivez-vous pour le paiement sur site Web informatique, le paiement mobile et le paiement par application.
Créer un compte privé Clé, clé publique, clé publique Alipay
Configurer la passerelle et l'adresse de rappel
Les éléments à noter sont les suivants :
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
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)
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
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.
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | /// <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
{
}
}
|
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 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | /// <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
};
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)
1 2 3 4 5 6 7 8 | 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 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <, > 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. 如果验证成功,跳转支付成功页面;如果失败,跳转支付失败页面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 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" ];
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!