支付寶香港API對接,非常的簡單,由於文檔是跟對接人溝通的,我就不發出來了,先看看效果。
圖一支付成功。
圖二支付失敗,原因15分鍾不掃碼就過期。重新在生成merchant_reference(唯一ID)


上代碼,如下
internal class Hash256
{
//加密秘鑰
internal const string secret = "GUID,這里我就亂寫了,用來加密的";
internal string UrlEncode(string str)
{
StringBuilder builder = new StringBuilder();
foreach (char c in str)
{
if (HttpUtility.UrlEncode(c.ToString()).Length > 1)
{
builder.Append(HttpUtility.UrlEncode(c.ToString()).ToUpper());
}
else
{
if (string.IsNullOrWhiteSpace(c.ToString()))
builder.Append(HttpUtility.UrlEncode(c.ToString()).ToUpper());
else
builder.Append(c.ToString());
}
}
return builder.ToString();
}
internal static string UrlEncode2(string str)
{
string urlStr = HttpUtility.UrlEncode(str);
var urlCode = Regex.Matches(urlStr, "%[a-f0-9]{2}", RegexOptions.Compiled).Cast<Match>().Select(m => m.Value).Distinct();
foreach (string item in urlCode)
{
urlStr = urlStr.Replace(item, item.ToUpper());
}
return urlStr;
}
internal static string GetSHA512HashFromString(string strData)
{
byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(strData);
try
{
SHA512 sha512 = new SHA512CryptoServiceProvider();
byte[] retVal = sha512.ComputeHash(bytValue);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
return sb.ToString();
}
catch (Exception ex)
{
throw new Exception("GetSHA512HashFromString() fail,error:" + ex.Message);
}
}
}
后台代碼如下。因為我們封裝過了,所以我就發關鍵代碼塊了。
public override void SendRequest()
{
var ip = HttpContext.Current.Request.UserHostAddress;
var dic = new Dictionary<string, object>
{
["merchant_reference"] = itemNumber,
["currency"] = CurryCode,//"HKD",
["amount"] = amount,
["customer_ip"] = ip,
["customer_first_name"] = "SOONNEST",
["customer_last_name"] = "Soonnest org",
//["customer_address"] = "customer_address",
["customer_phone"] = "07551654445",
["customer_email"] = buyerEmail,
//["customer_state"] = "NY",
//["customer_country"] = "US",
//["return_url"] = returnUrl.Replace(":9998", ""),
["network"] = "Alipay",
["subject"] = "支付捷訊商城商品訂單-" + itemNumber
};
var orderby = dic.OrderBy(x => x.Key).ToList();
var str = "";
StringBuilder stringBuilder = new StringBuilder();
foreach (var item in orderby)
{
str += item.Key + "=" + Hash256.UrlEncode2(item.Value.ToString()) + "&";
stringBuilder.Append(this.CreateField(item.Key, item.Value.ToString())); //唯一標識
}
stringBuilder.Append(this.CreateField("sign", Hash256.GetSHA512HashFromString(str.TrimEnd('&') + Hash256.secret)));
this.SubmitPaymentForm(this.CreateForm(stringBuilder.ToString(), GatewayUrl));
}
文章中的CreateForm,SubmitPaymentForm,是生成表單以及提交表單的動作,比較簡單,我就不寫了。
private const string GatewayUrl = "https://gateway.pa-sys.com/0b743214-d242-4951-89fe-facc0d6c2561/payment/query";
public override void VerifyNotify(int timeout, string configXml) { var sb = new StringBuilder(); var keys = parameters.AllKeys.OrderBy(x => x); var searchSing = ""; foreach (var Key in keys) { if (!Key.Equals("sign")) sb.Append(Key + "=" + Hash256.UrlEncode2(parameters[Key].ToString().Trim()) + "&"); if (Key.Equals("merchant_reference")) searchSing = Key.Trim() + "=" + Hash256.UrlEncode2(parameters[Key].ToString().Trim()); } var sing = Hash256.GetSHA512HashFromString(sb.ToString().TrimEnd('&') + Hash256.secret); if (!sing.Equals(parameters["sign"])) { PayLog.writeLog_Collection(this.parameters, configXml, GatewayUrl, "AlipayWXHKD-加密簽名失敗", LogType.AlipayWXHKD); } ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(GatewayUrl); httpWebRequest.Method = "POST"; httpWebRequest.ContentType = "application/x-www-form-urlencoded"; string text = string.Format("merchant_reference={0}&sign={1}", parameters["merchant_reference"].Trim(), Hash256.GetSHA512HashFromString(searchSing + Hash256.secret)); httpWebRequest.ContentLength = text.Length; StreamWriter streamWriter = new StreamWriter(httpWebRequest.GetRequestStream(), Encoding.ASCII); streamWriter.Write(text); streamWriter.Close(); StreamReader streamReader = new StreamReader(httpWebRequest.GetResponse().GetResponseStream()); string resultJson = streamReader.ReadToEnd(); streamReader.Close(); PayLog.writeLog_Collection(this.parameters, configXml, GatewayUrl, $"香港支付寶處理返回結果集" + resultJson, LogType.AlipayWXHKD); var result = JsonHelper.ParseFormJson<List<Payment>>(resultJson); if (result!=null && result.Any() && result.FirstOrDefault().status=="1") { this.OnFinished(false); this.OnPayment(); } else { this.OnNotifyVerifyFaild(); } }
文章中,OnFinished();OnPayment();OnNotifyVerifyFaild(); 做自己業務邏輯
如有遺漏,請評論區誒特,或加入群聊,新群人數較少,博主希望利用現有資源做一套快速開發框架,類似ABP。

