做全球性的支付,选用paypal!为什么选择paypal? 因为paypal是目前全球最大的在线支付工具,就像国内的支付宝一样,是一个基于买卖双方的第三方平台。买家只需知道你的paypal账号,即可在线直接把钱汇入你的账户,即时到账,简单方便快捷。
一、环境准备
- 注册paypal账号
- 先去“https://www.paypal.com”注册一个paypal账号,这一步就不演示了。
- 登陆paypal开发者账号
- 在浏览器输入“https://developer.paypal.com”,点击右上角的“Log into Dashboard”,用上一步创建好的账号登录。
- 查看测试用户
- 登录成功后,在左边的导航栏中点击 Sandbox 下的 Accounts,可以看到系统有两个已经生成好的测试账号(也可以自己创建两个)。
- 在浏览器输入:https://www.sandbox.paypal.com 在这里登陆测试账户。
- 登录成功后,在左边的导航栏中点击 Sandbox 下的 Accounts,可以看到系统有两个已经生成好的测试账号(也可以自己创建两个)。
- 创建应用,生成用于测试的clientID 和 密钥
- 点击左边导航栏Dashboard下的My Apps & Credentials,创建一个Sandbox(测试)应用。线上用live就可以。
- 点击刚刚创建好的应用,进入查看clientID 和 密钥
- 点击左边导航栏Dashboard下的My Apps & Credentials,创建一个Sandbox(测试)应用。线上用live就可以。
二、代码实现
使用第三方库 "github.com/plutov/paypal"简单实现
- 生成收款订单,代码如下
func CreateOrderPayer(amount string) (error, *paypal.Order) {
c, err := paypal.NewClient(clientID, secretID, paypal.APIBaseSandBox)
if err != nil {
return err, nil
}
_, err = c.GetAccessToken()
if err != nil {
return err, nil
}
purchaseUnits := make([]paypal.PurchaseUnitRequest, 1)
purchaseUnits[0] = paypal.PurchaseUnitRequest{
Amount: &paypal.PurchaseUnitAmount{
Currency: "USD", //收款类型
Value: amount, //收款数量
},
}
payer := &paypal.CreateOrderPayer{}
appContext := &paypal.ApplicationContext{
ReturnURL: "", //回调链接
}
order, err := c.CreateOrder("CAPTURE", purchaseUnits, payer, appContext)
if err != nil {
logging.Error("create order errors:", err)
return err, nil
}
return nil, order
//(*order).Links[1].Href就是支付的链接
}
注意:使用上面链接付款之后,收款账户并没有收到。还需要回调一下才可以。
//回调(可以利用上面的回调链接实现)
func PaypalCallback(orderId string) error {
c, err := paypal.NewClient(clientID, secretID, paypal.APIBaseSandBox)
if err != nil {
return err
}
_, err = c.GetAccessToken()
if err != nil {
return err
}
ctor := paypal.CaptureOrderRequest{}
order, err := c.CaptureOrder(orderId, ctor)
if err != nil {
return err
}
//查看回调完成后订单状态是否支付完成。
if (*order).Status != "COMPLETED" {
return errors.New("pay fail")
}
return nil
}
后言:
可能有许多不足之处,大家可以留言指明。