文章目录
前言
如题,最近在研究如何对接PayPal支付,在经过一段时间的摸索后,终于实现简单的支付操作,在这里分享下我个人的思路,让其他需要了解的人少走弯路,尽快对接上,申请注册PayPal账号这些我这里不多做解析,网上其他博主已经说得很详细(文字和截图都有),我主要说下如何入手,注意点以及易错点。
一、如何入手
在对接PayPal支付之前,相信很多人都已经对接过微信,支付宝支付,我也不例外,所以一开始接触PayPal支付的时候,我就习惯性的将其代入到以前对接过的支付中,觉得流程应该大同小异,简单点来说就是 发起支付请求 -> 用户授权支付 -> 支付回调 -> 业务处理,但是在查看了PayPal对接文档以及参考了其他博主文章后,发现除了上面我说的流程外,PayPal还多了一步,这一步按照文档的说法叫“批准订单”,但是这样听起来貌似不太好理解,换成通俗点来说就是 主动向PayPal确认收款,发请求给PayPal服务器跟他说可以收款了,如果没有这一步,支付并不算完成,卖家同样收不到款,这一点切记,这样我们就可以将PayPal支付流程简单的概括为 发起支付请求 -> 用户授权支付 -> 支付回调 -> 主动向PayPal确认收款 -> 业务处理
二、开发前准备
在正式开始之前,我们需要在PayPal开发者中心获取ClientId,Secret及设置Webhooks并得到对应Webhook ID,我暂且不细说这些东西的作用,等下根据流程来一一详解,如果不知道在哪里获取这些东西,我引入了其他博主的文章链接,可以直接点击查看,这个博主说的十分详细,里面包含文字和截图,相信看了之后就知道如何获取。
三、支付流程
通过上面得知,我们已将整个流程简单概括为发起支付请求 -> 用户授权支付 -> 支付回调 -> 主动向PayPal确认收款 -> 业务处理这几个步骤,接下来,我们将按照这个思路一步一步分析
通用类和通用方法如下:
---通用类---
public class Links
{
public string href {
get; set; }
public string rel {
get; set; }
public string method {
get; set; }
}
public class CheckoutOrdersResult
{
public string id {
get; set; }
public string status {
get; set; }
public List<Links> links {
get; set; }
}
public class WebhookEvent
{
public string id {
get; set; }
public string event_version {
get; set; }
public string create_time {
get; set; }
public string resource_type {
get; set; }
public string resource_version {
get; set; }
public string event_type {
get; set; }
public string summary {
get; set; }
public Resource resource {
get; set; }
public List<Links> links {
get; set; }
}
public class Resource
{
public string create_time {
get; set; }
public List<PurchaseUnits> purchase_units {
get; set; }
public List<Links> links {
get; set; }
public string id {
get; set; }
public string intent {
get; set; }
public string status {
get; set; }
}
public class PurchaseUnits
{
public string reference_id {
get; set; }
}
---通用类---
---通用方法
public string Post(string url, string clientId, string secret, Dictionary <string, object> dic, Encoding encoding)
{
var param = string.Empty;
foreach(var o in dic)
{
if(string.IsNullOrEmpty(param))
param += o.Key + "=" + o.Value;
else
param += "&" + o.Key + "=" + o.Value;
}
byte