前言
记录一下,那些年踩过的坑!
一、添加web窗体接收通知
用于接收第三方支付回调通知,请求链接例如:https://editor.csdn.net/Paypal/PaypalNotifyPage.aspx
二、使用步骤
1.引入bll
代码如下:
using Newtonsoft.Json.Linq;
using PayPal.Api;
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Web;
using System.Web.UI;
2.config配置文件
代码如下:
<paypal>
<settings>
<!-- 将模式替换为“ security-test-sandbox”以测试您的服务器是否支持TLSv1.2。 有关更多信息,请遵循README说明。-->
<add name="connectionTimeout" value="360000" />
<add name="requestRetries" value="1" />
<!-- 测试 -->
<add name="mode" value="sandbox" />
<add name="clientId" value="ASx_gEpY2EynTh_SfDGIWzo7fSVJlrb8YDxr_X1YLz_SXU5Q5eTwC9_0r3d0rTrhyKPEe2lgwlAzb2Tc" />
<add name="clientSecret" value="EGKDuKiVXK0TX3996cuHBba8UmEA29q9W3yoCfB_TAHS5KypxfirBvHrqUc-8u7CPy-lzFY4VaWF6L04" />
<!-- 正式 -->
<!--<add name="mode" value="live" />
<add name="clientId" value="" />
<add name="clientSecret" value="" />-->
</settings>
</paypal>
1、该处用于获取config 和accessToken的值。
2、clientId和clientSecret获取方式:
a、登录: PayPal Developer
b、选择Sandbox,创建app
c、点击进去就能看到 clientId和clientSecret 值
3.代码
代码如下:
public Page page { get; set; }
public PaypalService(Page page)
{
this.page = page;
}
public void PaypalPayNotify()
{
string strRequest = "";
try
{
page.Response.Write("200 OK");
var param = page.Request.BinaryRead(page.Request.ContentLength);
strRequest = Encoding.ASCII.GetString(param);
if (VerificationResponse(page.Request, strRequest).Equals("SUCCESS"))
{
WriteLog("执行业务操作VERIFIED");
JObject obj = JObject.Parse(strRequest);
string AmountTotal = obj["resource"]["amount"]["value"].ToString();//金额
string OrderNumber = obj["resource"]["invoice_id"].ToString();//订单号
string PayID = obj["resource"]["id"].ToString();//Paypal支付订单号
string PaymentStatus = obj["resource"]["status"].ToString();//交易状态
if (PaymentStatus == "COMPLETED")
{
//更新业务
}
else
{
//打印日志输出错误
// " Paypal更新支付出错,交易状态不正确!PaymentStatus:" + PaymentStatus
}
}
}
catch (Exception ex)
{
//捕获异常,打印日志输出错误
}
page.Response.End();
page.Response.Close();
}
/// <summary>
/// Webhooks回调响应验证
/// </summary>
/// <param name="ipnRequest"></param>
/// <param name="strRequest"></param>
/// <returns></returns>
public string VerificationResponse(HttpRequest ipnRequest, string strRequest)
{
try
{
//处理HttpWebRequest访问https有安全证书的问题( 请求被中止: 未能创建 SSL/TLS 安全通道。)
ServicePointManager.ServerCertificateValidationCallback += (s, cert, chain, sslPolicyErrors) => true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
System.Net.ServicePointManager.Expect100Continue = false;
var url = "https://api-m.sandbox.paypal.com/v1/notifications/verify-webhook-signature";//沙盒webhook回调通知
string transmissionId = ipnRequest.Headers["PAYPAL-TRANSMISSION-ID"];
string transmissionTime = ipnRequest.Headers["PAYPAL-TRANSMISSION-TIME"];
string certUrl = ipnRequest.Headers["PAYPAL-CERT-URL"];
string signatureAlgorithm = ipnRequest.Headers["PAYPAL-AUTH-ALGO"];
string transmissionSig = ipnRequest.Headers["PAYPAL-TRANSMISSION-SIG"];
var webhookId = "9XY05847MO097611P";
var dataStr = "{\"transmission_id\":\"" + transmissionId + "\",\"transmission_time\":\"" + transmissionTime + "\",\"cert_url\":\"" + certUrl + "\",\"auth_algo\":\"" + signatureAlgorithm + "\"" +
",\"transmission_sig\":\"" + transmissionSig + "\",\"webhook_id\":\"" + webhookId + "\",\"webhook_event\":" + strRequest + "}";
var config = ConfigManager.Instance.GetProperties();//读取配置文件
var accessToken = new OAuthTokenCredential(config).GetAccessToken();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/json";
request.Headers.Add("Authorization", accessToken);
//将有效负载附加到验证请求
var streamOut = new StreamWriter(request.GetRequestStream(), Encoding.ASCII);
streamOut.Write(dataStr);
streamOut.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream);
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
JObject obj = JObject.Parse(retString);
var VerificationStatus = obj["verification_status"].ToString();
return VerificationStatus;
}
catch (Exception exception)
{
//捕获异常,打印日志输出错误
return "";
}
}
1、该处用于支付Webhooks回调验证。
2、官方文档: 如何使用网络钩子模拟器;验证 webhook 签名api:/v1/notifications/verify-webhook-signature;
3、添加网络钩子步骤:
a、点击打开新建的app,添加Webhooks
b、保存后就可以获取到WebhookId了
4、也可以模拟Webhooks回调请求
总结
已经是按零基础去描述了,这样都看不懂,那你联系我,让我好好羞辱你一番!(狗头。