2021年:
最近又有国外项目需要接入paypal,这次准备使用官方最新的SDK:
PayPal REST SDKs
先跑个官方DEMO热热身,创建订单后返回了4个地址,目前只知道approve是支付链接,直接浏览器跳转支付即可。问题是异步回调怎么搞?难道是用传说中的Webhook?还得继续研究研究......
2018年:
最近几天公司项目接入paypal支付,跟同事一路磕磕绊绊,各种邮件联系技术客服,各种等邮件,最后终于对接完成。
中间遇到最大的坑,是APP端支付,IPN异步回调,一直不请求回调,该设置的回调地址都设置了好几遍,就在绝望时,昨晚抱着试试看的心态测试了一单,竟然回调了!!!沙盒环境调通了!!!可以安心切到生产环境了!!!
PC端支付代码很简单,APP端现成SDK,异步回调要主动请求paypal做个验签。
PC端发起支付代码,就一个表单,要稍微注意下表单提交地址和商户邮件,区分沙盒环境和生产环境!!
沙盒环境发起支付PC代码示例(生产环境:支付地址去掉sandbox,商户邮件改成正式即可):
<form name="paypal" action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post"><input type="hidden" name="cmd" value="_xclick"><input type="hidden" name="business" value="3094*****7-facilitator@qq.com"><input type="hidden" name="notify_url" value="http://www.test.com55.cn:80/api/notify/paypal"><input type="hidden" name="return" value="http://www.test.com55.cn:80/"><input type="hidden" name="cancel_return" value="http://www.test.com55.cn:80/"><input type="hidden" name="amount" value="0.01"><input type="hidden" name="currency_code" value="USD"><input type="hidden" name="item_name" value="订单号"><input type="hidden" name="on0" value="附加参数on0"><input type="hidden" name="os0" value="附加参数os0"><input type="hidden" name="on1" value="附加参数on1"><input type="hidden" name="os1" value="附加参数os1"></form><script>paypal.submit()</script>
异步回调接口,基于jfinal,PC端和APP端使用一套:
/*** paypal支付异步回调*/public void paypal() {System.out.println("paypal异步回调:");Map<String, String> queryParas = new HashMap<String, String>(16);queryParas.put("cmd", PaypalUtil.CMD_NOTIFY_VALIDATE);getParaMap().forEach((k, v) -> queryParas.put(k, v[0]));// 验签!! VERIFIED INVALIDString ret = HttpKit.get(PaypalUtil.PAY_URL, queryParas);if (!"VERIFIED".equals(ret)) {System.out.println("验签失败!!!");renderText("fail");return;}String paymentStatus = getPara("payment_status");String onumber = getPara("item_name");String amount = getPara("mc_gross");System.out.println("验签成功!!!");System.out.println("paymentStatus:" + paymentStatus);if (!"Completed".equals(paymentStatus)) {System.out.println("payment_status异常:" + paymentStatus);renderText("fail");return;}//后续逻辑!!!自己写!!! 最后告诉paypal成功失败 renderText("success");
PaypalUtil.java
public class PaypalUtil {/*** sandbox/live*/public static final String MODE = "sandbox";public static final String BUSINESS = "***-facilitator@qq.com";public final static String CLENT_ID = "";/*** PC端,生产环境需删除sandbox*/public final static String PAY_URL = "https://www.sandbox.paypal.com/cgi-bin/webscr";public final static String CURRENCY = "USD";public final static String CMD_XCLICK = "_xclick";public final static String CMD_NOTIFY_VALIDATE = "_notify-validate";}
最后大家一块感受下,成功的喜悦!!UTF-8编码,需要进商户设置。
还是很纳闷,APP端支付时,怎么会没有异步回调地址notify_url这个参数呢?只能设置到商户中吗?为啥PC端有呢?客服说有,原生同事说没有......
附上两封技术客服回复邮件截图:
paypal支付各种配置各种坑。
肯定还有很多未踩到的坑.......