paypal支付标准按钮(from表单)集成
1.简介
PayPal是倍受全球亿万用户追捧的国际贸易支付工具,即时支付,即时到账,全中文操作界面,能通过中国的本地银行轻松提现,解决外贸收款难题,助您成功开展海外业务,决胜全球。注册PayPal后就可立即开始接受信用卡付款。作为在线付款服务商,PayPal是您向全世界近2.54亿的用户敞开大门的最快捷的方式。最大的好处是,注册完全免费!集国际流行的信用卡,借记卡,电子支票等支付方式于一身。帮助买卖双方解决各种交易过程中的支付难题。PayPal是名副其实的全球化支付平台, 服务范围超过200个市场, 支持的币种超过100个。 在跨国交易中, 将近70%的在线跨境买家更喜欢用PayPal支付海外购物款项。
PayPal提供了多种支付方式:
- 标准支付
- 快速支付
- 其中标准支付誉为最佳实践。
注意:paypal支付国内账号不能付款给国内账号
2.PayPal的相关URL
沙箱(开发者)网址:https://developer.paypal.com/
沙箱(测试用户)登录地址:https://www.sandbox.paypal.com/
技术支持地址(paypal开发人员):https://www.paypal-support.com/s/account-overview
官方文档:
- 付款按钮资料:https://developer.paypal.com/docs/integration/web/
- IPN(支付回调)资料:https://developer.paypal.com/docs/api-basics/notifications/ipn/ht-ipn/
- PDT(数据传输)资料:https://developer.paypal.com/docs/api-basics/notifications/payment-data-transfer/#get-started
- PDT示例代码:https://github.com/paypal/pdt-code-samples
3.集成步骤
1、在paypal页面创建Buttons(PayPal付款按钮)并复制代码到项目
2、用户点击支付按钮
3、进入PayPal支付页面
4、用户登录后确认支付
5、显示支付成功信息
4.集成步骤实现
(1)注册账号
在PayPal正式网站https://www.paypal.com中注册一个账号,如果公司没有给你相关信息的话,先注册一个个人账号也是一样的。
(2)进入开发者界面创建相关信息
1、在开发者平台https://developer.paypal.com/,登录刚创建的账号
2、登录成功后,选择:SANBOX下的Accounts标签
3、创建个人账号和商家账号用于测试沙箱环境
(3)创建按钮
1、在PayPal沙箱测试账号网站https://www.sandbox.paypal.com/登录刚刚创建的沙箱商家账号
2、创建支付按钮
(4)PDT令牌获取
(5)IPN回调乱码处理
(6)示例代码
控制器代码如下:
@Controller @RequestMapping("/paypalC") public class PaypalC { @Autowired private PaypalS paypalS; //TODO 标准付款按钮集成 /**交易取消 */ @RequestMapping(method = RequestMethod.GET, value = "cancel") public String cancel(){ return "b2/paypal/cancel"; } /**获取标准付款页面 */ @RequestMapping(method = RequestMethod.GET, value = "standardPayment", produces="text/html;charset=UTF-8") public String standardPayment(){ return "b2/paypal/standardPayment"; } /**PDT立即回调(由用户在paypal点击返回商家网站时调用,不点击则不会调用,含跳转路径) */ @RequestMapping(value = "pdtWebhooks", produces="text/html;charset=UTF-8") public String pdtWebhooks(HttpServletRequest req, HttpServletResponse resp){ return paypalS.pdtWebhooks(req, resp); } /**IPN回调(由paypal支付成功后调用,最多重复调用15次) */ @ResponseBody @RequestMapping(method = RequestMethod.POST, value = "ipnWebhooks", produces="text/html;charset=UTF-8") public String ipnWebhooks(HttpServletRequest req, HttpServletResponse resp) { return paypalS.ipnWebhooks(req, resp); } }
业务层代码如下:
import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import org.springframework.stereotype.Service; import com.grt.b2.method.PaypalUtils; import com.grt.v3.method.OUtils; /**Paypal支付service类 */ @Service public class PaypalS { //TODO 标准付款按钮集成 /**PDT立即回调(由用户在paypal点击返回商家网站时调用,不点击则不会调用,含跳转路径) */ public String pdtWebhooks(HttpServletRequest req, HttpServletResponse resp) { String tx = req.getParameter("txn_id");//订单id String stringRes = PaypalUtils.getPDTWebHooks(tx); if(!OUtils.isEmpty(stringRes)){ String[] res = stringRes.split("\r?\n"); if("SUCCESS".equals(res[0])){ System.out.println("验证PDT数据成功,进行订单入库"); Map<String, String> data = new HashMap<String, String>(); for (String str : res) { if(str.indexOf("=") > 0){ String[] s = str.split("="); data.put(s[0], s.length > 1 ? s[1] : ""); } } return "b2/paypal/success"; } } return "b2/paypal/failure"; } /**IPN回调(由paypal支付成功后调用,最多重复调用15次) */ @SuppressWarnings("unchecked") public String ipnWebhooks(HttpServletRequest req, HttpServletResponse resp) { //1.获取ipn传递的数据 Map<String, String> data = new HashMap<String, String>(); List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("cmd", "_notify-validate")); Enumeration<String> e = req.getParameterNames(); while(e.hasMoreElements()){ String name = e.nextElement(); String value = req.getParameter(name); params.add(new BasicNameValuePair(name, value)); data.put(name, value); } //2.把ipn传递数据发送给paypal并获取返回数据进行验证 String res = PaypalUtils.getIPNWebHooks(params); System.out.println("IPN数据 "+res); if ("VERIFIED".equals(res)) {//验证IPN回调数据成功 System.out.println("验证IPN回调数据成功,进行订单入库"); }else if("INVALID".equals(res)) {//验证IPN回调数据失败 System.out.println("验证IPN回调数据失败,进行日志记录"); }else{//验证IPN回调数据异常 System.out.println("验证IPN回调数据异常,进行日志记录"); } return ""; } }