PayPal快速结账(Express Checkout,EC)集成指南
Zencart和Magento的PayPal支付接口设置

BUSINESS PAYMENTS INTEGRATION
Confidential and Proprietary
12/6/2011
2
Magento
Magento是一套专业开源的电子商务系统。Magento设计得 非常灵活,具有模块化架构体系和丰富的功能。易于与第 三方应用系统无缝集成。 Magento官方网站:
选择选项2,点击申请API凭证
选择申请API签名,点击“同意并 提交”,便可出现API用户名,密 码和签名
BUSINESS PAYMENTS INTEGRATION
Confidential and Proprietary
12/6/2011
20
12/6/2011
12
Zen-Cart 1.3.9快速结账(最佳集成)配置(2)
选择true 是否要求买家 的地址是被确 认的
是否在购物车页 面显示paypal shortcut按钮。 选择on,为显示。
是否选择最便 宜的邮寄方式 是否选择跳过 付款确认页面。 是否自动创建 paypal账户 选择立即支付 还是预授权支 付
是否启用清算报告,如果启用 可以在这部分配置。
BUSINESS PAYMENTS INTEGRATION
Confidential and Proprietary
12/6/2011
8
Magento 1.5.1共同部分配置 (2)
是否放置paypal图标在首页, 建议保留默认值。 在paypal账户中设置的页面样 式名称。 在paypal付款页面,左上角可 以显示公司logo,在这里设置 logo图片的地址。最大为 750X90,建议采用https地址。
PayPal网站付款标准版(Website Payment Standard,WPS)集成指南

PayPal网站付款标准版(Website Payment Standard)集成指南PayPal网站付款标准版(Website Payment Standard简称WPS)是基于HTML 的PayPal集成解决方案。
如果你需要简单快速地在你的网站上集成PayPal的支付方式,那么标准版是一个非常不错的选择。
你只需在你的网站上添加一段HTML代码即可实现。
标准版主要包括以下几种基础产品:• 立即购买按钮(Buy Now Buttons):适用于购买单件物品;• PayPal 购物车(PayPal Shopping Cart):适用于多件物品的付款;• 上传购物车(Cart Upload ):适用于提交第三方购物车中的商品;• 捐赠按钮(Donation Buttons):适用于慈善事业或者接受捐赠;• 订阅按钮(Subscription Buttons):适用于周期性付款;<form action="https:///cgi-bin/webscr"method="post"><input type="hidden" name="cmd" value="_xclick"><input type="hidden" name="business" value="sample@"> <input type="hidden" name="item_name" value="Item Name Goes Here "><input type="hidden" name="item_number" value="Item Number Goes Here "><input type="hidden" name="amount" value="100.00"><input type="hidden" name="no_shipping" value="2"><input type="hidden" name="no_note" value="1"><input type="hidden" name="currency_code" value="USD"><input type="image"src="https:///en_US/i/btn/x-click-but23.gif"name="submit" alt="Make payments with PayPal - it's fast, free and secure!></form><1> <2><3>网站付款标准版(Website Payment Standard简称WPS)是基于HTML的PayPal集成解决方案。
PayPal 快速结帐 NVP API 开发指南

PayPal 快速结账NVP API 开发指南EC Express Checkout NVP Name-Value Pair IPN Instant Payment Notification API Application Programming Interface概览以下列出了本文件中用到的专门术语的英文缩写和全称PayPal NVP API 简介PayPal NVP API 是简单的编程接口,允许您(商家)使用 PayPal 的业务功能来执行以下操作:● 使用“快速结账”功能在您的网站上接受 PayPal 结账。
● 使用“直接付款”功能向信用卡收费。
● 捕获先前通过“快速结账”、“直接付款”或“网站付款标准版”授权的付款。
● 重新授权或作废以前的授权。
● 使用“集中付款”功能向一位或多位收款人付款。
● 发放全额退款或多笔部分退款。
● 使用开始日期或其他条件搜索交易。
●查看特定交易的明细。
PayPal NVP API 能够简化向网络应用程序添加 PayPal 的过程。
您构建 NVP 字符串并使用 HTTPS 将其发布到 PayPal 服务器。
然后 PayPal 发回一个 NVP 格式的响应。
NVP 格式NVP 是指定字符串中的名称和值的一种方法。
NVP 是表示URI 规范中的查询的非正式名称。
NVP 字符串附加到URL 上。
NVP 字符串符合以下准则: ● 名称和值用等号(=)分隔。
例如:FIRSTNAME=Robert ● 名称/值对用与号(&)分隔。
例如:FIRSTNAME=Robert&MIDDLENAME=Herbert&LASTNAME=Moore ● NVP 字符串中每个字段的值已经过URL 编码。
请求格式每个NVP请求都由必需的和可选的参数及其值组成。
参数名称不区分大小写。
本文档中的重要信息:您必须在实施过程中保护USER、PWD和SIGNATURE的值。
paypal文档.ppt

2/13/2020 18
Harry Yang,杨威 2011
Confidential and Proprietary
2/13/2020 19
GO TO HEADER/ FOOTER MENU TO SET TITLE
Confidential and Proprietary
2/13/2020 20
高级账户 :适用于在线购物或在线销售的个人用户
– 可以付款、收款,并可享受商家费率,使用网站付款标准版(Website Payment Standard),快速结帐(Express Checkout)等集成工具以及 集中付款功能,帮助商家提升销售额,推荐进行跨国交易的个人卖家使。
企业账户 :适用于以企业或团体名义经营的商家,特别是使用公司银行账户提 现的商家用户。
Confidential and Proprietary
2/13/2020 16
商家工具
Harry Yang,杨威 2011
Confidential and Proprietary
2/13/2020 17
商家工具
Harry Yang,杨威 2011
Confidential and Proprietary
2/13/2020
8
PAYPAL收费标准
卖家跨国交易费用 货币转换费 提现费用
Harry Yang,杨威 2011
Confidential and Proprietary
2/13/2020
9
PAYPAL收费标准
Harry Yang,杨威 2011
Confidential and Proprietary
– 拥有高级账户的所有商家功能,并支持多用户管理 (可以设置多个不同登陆 名和密码,并分别为其设置不同操作权限,以便职员只能对账户中其负责的 部分进行查看和操作)。 另外,企业账户需要添加企业名开办的电汇银行账 户进行转账,添加个人名字开办的电汇银行账户可能导致转账失败。
PayPal支付接口方式(checkout)集成

PayPal⽀付接⼝⽅式(checkout)集成1.简述 PayPal是倍受全球亿万⽤户追捧的国际贸易⽀付⼯具,即时⽀付,即时到账,全中⽂操作界⾯,能通过中国的本地银⾏轻松提现,解决外贸收款难题,助您成功开展海外业务,决胜全球。
注册PayPal后就可⽴即开始接受信⽤卡付款。
作为在线付款服务商,PayPal是您向全世界近2.54亿的⽤户敞开⼤门的最快捷的⽅式。
最⼤的好处是,注册完全免费!集国际流⾏的信⽤卡,借记卡,电⼦⽀票等⽀付⽅式于⼀⾝。
帮助买卖双⽅解决各种交易过程中的⽀付难题。
PayPal是名副其实的全球化⽀付平台,服务范围超过200个市场,⽀持的币种超过100个。
在跨国交易中,将近70%的在线跨境买家更喜欢⽤PayPal⽀付海外购物款项。
PayPal提供了多种⽀付⽅式:标准⽀付快速⽀付其中标准⽀付誉为最佳实践。
注意:paypal⽀付国内账号不能付款给国内账号2.PayPal的相关URL官⽅⽂档:3.PayPal Checkout集成步骤 1、整合Smart Payment Buttons(PayPal智能付款按钮)到页⾯ 2、⽤户点击⽀付按钮 3、按钮调⽤PayPal Orders API来创建交易 4、进⼊PayPal⽀付页⾯ 5、⽤户登录后确认⽀付 6、按钮调⽤PayPal Orders API来完成交易 7、显⽰⽀付成功信息4.PayPal Checkout集成步骤实现(1)注册账号(2)进⼊开发者界⾯创建相关信息 2、登录成功后,选择:SANBOX下的Accounts标签 3、创建个⼈账号和商家账号⽤于测试沙箱环境 4、创建APP获取client id和secret 点击Create app创建(3)⽰例代码 控制器代码如下:@Controller@RequestMapping("/paypalC")public class PaypalC {@Autowiredprivate PaypalS paypalS;@RequestMapping(method = RequestMethod.GET)public String index(){return "index";}/**创建订单*/@RequestMapping(method = RequestMethod.POST, value = "createOrder")public void createOrder(HttpServletRequest req, HttpServletResponse resp){paypalS.createOrder(req, resp);}/**执⾏付款*/@RequestMapping(method = RequestMethod.POST, value = "executePayment")public void executePayment(HttpServletRequest req, HttpServletResponse resp){paypalS.executePayment(req, resp);}/**交易取消*/@RequestMapping(method = RequestMethod.GET, value = "cancel")public String cancel(){return "cancel";/**交易成功返回页⾯*/@RequestMapping(method = RequestMethod.GET, value = "success")public String success(HttpServletRequest req, HttpServletResponse resp, String orderId){req.setAttribute("orderId", orderId);return "success";}/**查询交易详情*/@RequestMapping(method = RequestMethod.POST, value = "paymentDetails")public void paymentDetails(HttpServletRequest req, HttpServletResponse resp, String orderId){paypalS.paymentDetails(req, resp, orderId);}}View Code 业务层代码如下:/**Paypal⽀付service类*/@Servicepublic class PaypalS {/**创建订单*/public void createOrder(HttpServletRequest req, HttpServletResponse resp){//1.获取paypal的tokenString accessToken = PaypalUtils.getAccessToken();//2.提交交易到paypalString BaseUrl = req.getScheme() + "://"+ req.getServerName() + ((req.getServerPort() == 80) ? "" : ":" + req.getServerPort()) + req.getContextPath(); String result = PaypalUtils.createOrder(req, accessToken, BaseUrl);resp.setContentType("application/json");try {PrintWriter out = resp.getWriter();out.print(result);} catch (IOException e) {e.printStackTrace();}}/**执⾏付款*/public void executePayment(HttpServletRequest req, HttpServletResponse resp){resp.setContentType("application/json");try {String jsonFromHtml = readInputStreamForData(req); // holding the json from requestJSONObject json = JSONObject.parseObject(jsonFromHtml);String orderId = json.getString("orderId");//付款idString accessToken = PaypalUtils.getAccessToken();String result = PaypalUtils.executePayment(req, accessToken, orderId);PrintWriter out = resp.getWriter();out.print(result);}catch(Exception e) {e.printStackTrace();try {PrintWriter out = resp.getWriter();out.print(new AjaxDto(0, "⽀付失败,请联系管理员...", req).toJson());} catch (IOException e1) {e1.printStackTrace();}}}/**查询交易详情*/public void paymentDetails(HttpServletRequest req, HttpServletResponse resp,String orderId){try {String accessToken = PaypalUtils.getAccessToken();JSONObject dataFromGetPaymentsAPI = PaypalUtils.getPaymentDetails(req, accessToken, orderId);resp.setContentType("application/json");resp.setStatus(200);PrintWriter out = resp.getWriter();out.print(dataFromGetPaymentsAPI);} catch (Exception e) {resp.setStatus(500);resp.setContentType("application/json");try {PrintWriter out = resp.getWriter();Map<String, String> error = new HashMap<String, String>();error.put("error", "获取交易详情失败,请联系管理员");out.print(error);} catch (IOException e1) {e1.printStackTrace();}}}/**获取req传递参数*/private String readInputStreamForData(HttpServletRequest req) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(req.getInputStream()));String json = "";if(br != null) {json = br.readLine();}return json;}}View Code PayPal⼯具类如下:public class PaypalUtils {private static Log log = LogFactory.getLog(PaypalUtils.class);/**true表⽰测试环境(沙盒),false:正式环境*/private static boolean IS_APPLICATION_IN_SANDBOX = true;//TODO 测试环境使⽤/**沙盒帐户详细信息-卖⽅*/private static String SELLAR_SANDBOX_EMAIL = "";//邮箱private static String SELLAR_SANDBOX_PASSWORD = "";//密码private static String SELLAR_SANDBOX_SIGNATURE = "";//标签/**App Client ID 和 SECRET*/private static String CLIENT_ID = "";//Client IDprivate static String SECRET = "";//SECRETprivate static String ACCESS_TOKEN_URL = "https:///v1/oauth2/token";//获取token接⼝private static String CREATE_PAYMENT_URL = "https:///v2/checkout/orders";private static String EXECUTE_PAYMENT_URL = "https:///v2/checkout/orders/{id}/capture"; private static String GET_PAYMENT_DETAILS = "https:///v2/checkout/orders/{id}";//TODO 正式环境使⽤/**真实帐户详细信息-卖⽅*/private static String SELLAR_LIVE_EMAIL = "";//邮箱private static String SELLAR_LIVE_PASSWORD = "";//密码private static String SELLAR_LIVE_SIGNATURE = "";//标签/**App Client ID 和 SECRET*/private static String CLIENT_ID_LIVE = "";//Client IDprivate static String SECRET_LIVE = "";//SECRETprivate static String ACCESS_TOKEN_URL_LIVE = "https:///v1/oauth2/token";//获取token接⼝private static String CREATE_PAYMENT_URL_LIVE = "https:///v2/checkout/orders";private static String EXECUTE_PAYMENT_URL_LIVE = "https:///v2/checkout/orders/{id}/capture"; private static String GET_PAYMENT_DETAILS_LIVE = "https:///v2/checkout/orders/{id}";private static String CANCEL_URL= "paypalC/cancel";//交易失败页⾯private static String RETURN_URL= "paypalC/success";//交易成功页⾯/**初始化配置实体*/public static PaypalConfigBean paypalConfigBean = new PaypalConfigBean();static{if(IS_APPLICATION_IN_SANDBOX) {// load all properties for sandboxpaypalConfigBean.setAccessTokenUrl(ACCESS_TOKEN_URL);paypalConfigBean.setClientId(CLIENT_ID);paypalConfigBean.setCreatePaymentsUrl(CREATE_PAYMENT_URL);paypalConfigBean.setExecutePaymentsUrl(EXECUTE_PAYMENT_URL);paypalConfigBean.setGetPaymentsDetailsUrl(GET_PAYMENT_DETAILS);paypalConfigBean.setSecret(SECRET);}else {// load all properties for livepaypalConfigBean.setAccessTokenUrl(ACCESS_TOKEN_URL_LIVE);paypalConfigBean.setClientId(CLIENT_ID_LIVE);paypalConfigBean.setCreatePaymentsUrl(CREATE_PAYMENT_URL_LIVE);paypalConfigBean.setExecutePaymentsUrl(EXECUTE_PAYMENT_URL_LIVE);paypalConfigBean.setGetPaymentsDetailsUrl(GET_PAYMENT_DETAILS_LIVE);paypalConfigBean.setSecret(SECRET_LIVE);}paypalConfigBean.setCancelUrl(CANCEL_URL);paypalConfigBean.setReturnUrl(RETURN_URL);}//TODO paypal请求处理/**获取paypal的Token*/public static String getAccessToken() {Map<String, String> headers = new HashMap<String, String>();String token = getBasicBearerToken(paypalConfigBean.getClientId(), paypalConfigBean.getSecret());headers.put("Content-Type", "application/x-www-form-urlencoded");headers.put("accept-language", "en_US");headers.put("Authorization", token);String param = "grant_type=client_credentials";try {Map<String, String> data = HttpsUtils.doPost(headers, param, paypalConfigBean.getAccessTokenUrl());if(!OUtils.isEmpty(data.get("statusCode")) && data.get("statusCode").startsWith("2")){JSONObject jsonObj = JSONObject.parseObject(data.get("data"));return jsonObj.getString("access_token");}else{log.error("paypal的token获取失败,参数:"+token+",返回结果:"+data);}} catch (Exception e) {log.error(e.getMessage());}return "";}/**创建订单*/public static String createOrder(HttpServletRequest req, String accessToken, String BaseUrl){Map<String, String> headers = new HashMap<String, String>();headers.put("Content-Type", "application/json");headers.put("accept-language", "en_US");headers.put("authorization", "Bearer "+accessToken);List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();//订单信息Map<String, Object> order = new HashMap<String, Object>();Map<String, String> orderInfo = new HashMap<String, String>();orderInfo.put("currency_code", "USD");//⽀付货币orderInfo.put("value", "100.00");//⽀付⾦额order.put("reference_id","PUHF");//订单编号,多个订单时使⽤order.put("amount", orderInfo);list.add(order);Map<String, String> redirects = new HashMap<String, String>();redirects.put("return_url", BaseUrl+"/"+paypalConfigBean.getReturnUrl());//付款成功返回地址redirects.put("cancel_url", BaseUrl+"/"+paypalConfigBean.getCancelUrl());//付款失败返回地址Map<String, Object> params = new HashMap<String, Object>();params.put("intent", "CAPTURE");//创建付款params.put("purchase_units", list);//订单信息params.put("application_context", redirects);//返回地址,⽆效的地址Map<String, Object> result = new HashMap<String, Object>();try {String param = JSONObject.toJSONString(params);Map<String, String> data = HttpsUtils.doPost(headers, param, paypalConfigBean.getCreatePaymentsUrl());if(!OUtils.isEmpty(data.get("statusCode")) && data.get("statusCode").startsWith("2")){JSONObject jsonObj = JSONObject.parseObject(data.get("data"));result.put("id", jsonObj.getString("id"));}else{log.error("paypal创建订单失败,token:"+accessToken+",参数:"+param+",返回结果:"+data);return new AjaxDto(0, "创建订单失败,请联系管理员...", req).toJson();}} catch (Exception e) {log.error(e.getMessage());}return new AjaxDto(1, null, result).toJson();}/**执⾏paypal付款*/public static String executePayment(HttpServletRequest req, String accessToken, String orderId) throws Exception { Map<String, String> headers = new HashMap<String, String>();headers.put("Content-Type", "application/json");headers.put("Authorization", "Bearer "+accessToken);String url = paypalConfigBean.getExecutePaymentsUrl().trim();url = url.replace("{id}", orderId);Map<String, Object> result = new HashMap<String, Object>();try {Map<String, String> data = HttpsUtils.doPost(headers, null, url);if(!OUtils.isEmpty(data.get("statusCode")) && data.get("statusCode").startsWith("2")){JSONObject jsonObj = JSONObject.parseObject(data.get("data"));result.put("id", jsonObj.getString("id"));}else{log.error("paypal⽀付失败,token:"+accessToken+",返回结果:"+data);return new AjaxDto(0, "⽀付失败,请联系管理员...", req).toJson();}} catch (Exception e) {e.printStackTrace();}return new AjaxDto(1, null, result).toJson();}/**获取付款详情*/public static JSONObject getPaymentDetails(HttpServletRequest req, String accessToken, String orderId) throws Exception {Map<String, String> headers = new HashMap<String, String>();headers.put("Content-Type", "application/json");headers.put("Authorization", "Bearer "+accessToken);String url = paypalConfigBean.getGetPaymentsDetailsUrl().trim();url = url.replace("{id}", orderId);String data = HttpsUtils.doGet(headers, url);if(!OUtils.isEmpty(data)){JSONObject jsonObj = JSONObject.parseObject(data);return jsonObj;}return null;}/**把paypal的clientId、secret转为Base64*/private static String getBasicBearerToken(String clientId, String secret) {String token = clientId.toString().trim() +":"+secret.toString().trim();token = token.replace("\"", "");Base64 b = new Base64();String accessToken = b.encodeAsString(new String(token).getBytes());return "Basic "+ accessToken;}/**paypal返回的错误*/private static String getPaypalError(String statusCode,String errorCode){return "";}}View Code HttpUtils⼯具类(httpclient-4.5.jar、httpcore-4.4.1.jar)如下:public class HttpsUtils {private static final String HTTP = "http";private static final String HTTPS = "https";private static SSLConnectionSocketFactory sslsf = null;private static PoolingHttpClientConnectionManager cm = null;private static SSLContextBuilder builder = null;static {try {builder = new SSLContextBuilder();// 全部信任不做⾝份鉴定builder.loadTrustMaterial(null, new TrustStrategy() {@Overridepublic boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {return true;}});sslsf = new SSLConnectionSocketFactory(builder.build(), new String[] { "SSLv2Hello", "SSLv3", "TLSv1", "TLSv1.2" }, null, NoopHostnameVerifier.INSTANCE);Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory> create().register(HTTP, new PlainConnectionSocketFactory()).register(HTTPS, sslsf).build(); cm = new PoolingHttpClientConnectionManager(registry);cm.setMaxTotal(200);// max connection} catch (Exception e) {e.printStackTrace();}}/*** httpClient post请求** @param url* 请求url* @param header* 头部信息* @param param* 请求参数 form提交适⽤* @param entity* 请求实体 json/xml提交适⽤* @return可能为空需要处理* @throws Exception**/public static String doGet(String url) throws Exception {String result = "";CloseableHttpClient httpClient = null;try {httpClient = getHttpClient();HttpGet httpGet = new HttpGet(url);RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(30000).setConnectTimeout(30000).build();// 设置请求和传输超时时间httpGet.setConfig(requestConfig);HttpResponse httpResponse = httpClient.execute(httpGet);int statusCode = httpResponse.getStatusLine().getStatusCode();if (statusCode == HttpStatus.SC_OK) {HttpEntity resEntity = httpResponse.getEntity();result = EntityUtils.toString(resEntity);} else {readHttpResponse(httpResponse);}} catch (Exception e) {throw e;} finally {if (httpClient != null) {httpClient.close();}}return result;}/*** httpClient post请求** @param url* 请求url* @param header* 头部信息* @param param* 请求参数 form提交适⽤* @param entity* 请求实体 json/xml提交适⽤* @return可能为空需要处理* @throws Exception**/public static String doPost(String url, Map<String, String> header, Map<String, String> param, HttpEntity entity) throws Exception {String result = "";CloseableHttpClient httpClient = null;try {httpClient = getHttpClient();HttpPost httpPost = new HttpPost(url);// 设置头信息if (MapUtils.isNotEmpty(header)) {for (Map.Entry<String, String> entry : header.entrySet()) {httpPost.addHeader(entry.getKey(), entry.getValue());}}// 设置请求参数if (MapUtils.isNotEmpty(param)) {List<NameValuePair> formparams = new ArrayList<NameValuePair>();for (Map.Entry<String, String> entry : param.entrySet()) {// 给参数赋值formparams.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));}UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(formparams, Consts.UTF_8);httpPost.setEntity(urlEncodedFormEntity);}// 设置实体优先级⾼if (entity != null) {httpPost.setEntity(entity);}HttpGet httpGet = new HttpGet(url);HttpResponse httpResponse = httpClient.execute(httpGet);int statusCode = httpResponse.getStatusLine().getStatusCode();if (statusCode == HttpStatus.SC_OK) {HttpEntity resEntity = httpResponse.getEntity();result = EntityUtils.toString(resEntity);} else {readHttpResponse(httpResponse);}} catch (Exception e) {throw e;} finally {if (httpClient != null) {httpClient.close();}}return result;}public static String doGet(Map<String, String> header, String url) throws Exception {String result = "";CloseableHttpClient httpClient = null;try {httpClient = getHttpClient();HttpGet httpGet = new HttpGet(url);if (MapUtils.isNotEmpty(header)) {for (Map.Entry<String, String> entry : header.entrySet()) {httpGet.addHeader(entry.getKey(), entry.getValue());}}RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(30000).setConnectTimeout(30000).build();// ��������ʹ��䳬ʱʱ�� httpGet.setConfig(requestConfig);HttpResponse httpResponse = httpClient.execute(httpGet);int statusCode = httpResponse.getStatusLine().getStatusCode();if (statusCode == HttpStatus.SC_OK) {HttpEntity resEntity = httpResponse.getEntity();result = EntityUtils.toString(resEntity);} else {readHttpResponse(httpResponse);}} catch (Exception e) {throw e;} finally {if (httpClient != null) {httpClient.close();}}return result;}public static Map<String, String> doPost(Map<String, String> header, String param, String url) throws Exception {Map<String, String> data = new HashMap<String, String>();CloseableHttpClient httpClient = null;try {httpClient = getHttpClient();HttpPost httpPost = new HttpPost(url);if (MapUtils.isNotEmpty(header)) {for (Map.Entry<String, String> entry : header.entrySet()) {httpPost.addHeader(entry.getKey(), entry.getValue());}}if (!OUtils.isEmpty(param)) {httpPost.setEntity(new StringEntity(param));}HttpResponse httpResponse = httpClient.execute(httpPost);HttpEntity resEntity = httpResponse.getEntity();data.put("statusCode", String.valueOf(httpResponse.getStatusLine().getStatusCode()));data.put("data", EntityUtils.toString(resEntity));} catch (Exception e) {throw e;} finally {if (httpClient != null) {httpClient.close();}}return data;}public static CloseableHttpClient getHttpClient() throws Exception {CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).setConnectionManager(cm).setConnectionManagerShared(true).build();return httpClient;}public static String readHttpResponse(HttpResponse httpResponse) throws ParseException, IOException {StringBuilder builder = new StringBuilder();// 获取响应消息实体HttpEntity entity = httpResponse.getEntity();// 响应状态builder.append("status:" + httpResponse.getStatusLine());builder.append("headers:");HeaderIterator iterator = httpResponse.headerIterator();while (iterator.hasNext()) {builder.append("\t" + iterator.next());}// 判断响应实体是否为空if (entity != null) {String responseString = EntityUtils.toString(entity);builder.append("response length:" + responseString.length());builder.append("response content:" + responseString.replace("\r\n", ""));}return builder.toString();}}View Code cancel.html代码如下:<html><head><meta charset="UTF-8" /><title>Insert title here</title></head><body><h1>⽤户取消⽀付...</h1></body></html>View Code index.html代码如下:<div style="width:20px;" id="paypal-button-container"></div><script src="https:///sdk/js?client-id=sb&commit=false"></script><!-- client-id正式环境需要改,测试环境才⽤sb --><script>paypal.Buttons({env: 'sandbox', /* sandbox | production */style: {layout: 'horizontal', // 布局⽅式:vertical: 垂直,horizontal:⽔平,size: 'responsive', /* medium | large | responsive*/shape: 'pill', /* pill | rect*/color: 'gold', /* gold | blue | silver | black*/label: 'paypal'},commit: false, // Show a 'Pay Now' button/* createOrder() is called when the button is clicked */createOrder: function() {/* Set up a url on your server to create the order */var CREATE_URL = '<%=request.getContextPath() %>/paypalC/createOrder';/* Make a call to your server to set up the payment */return fetch(CREATE_URL,{method: 'post'}).then(function(res) {return res.json();}).then(function(data) {if(data.result == 1)return data.obj.id;else{alert(data.msg);}});},/* onApprove() is called when the buyer approves the payment */onApprove: function(data, actions) {/* Set up a url on your server to execute the payment */var EXECUTE_URL = '<%=request.getContextPath() %>/paypalC/executePayment';/* Set up the data you need to pass to your server *//* Make a call to your server to execute the payment */return fetch(EXECUTE_URL, {method: 'post',body: JSON.stringify({orderId: data.orderID})}).then(function(res) {return res.json();}).then(function(data) {if(data.result == 1)window.location.href='<%=request.getContextPath() %>/paypalC/success?orderId='+data.obj.id;else{alert(data.msg);}});},onCancel: function() {return window.location.href='<%=request.getContextPath() %>/paypalC/cancel';}}).render('#paypal-button-container');</script>View Code success.html代码如下:<html><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1"><title>PayPal Credit</title><!--Including Bootstrap style files--><link href="https:///bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"><link href="https:///font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN" crossorigin="anonymou <style>/* /gradient/ */.bg-color {color: white;background: -moz-linear-gradient(0deg, #004094 0%, #0096D9 50%, #004094 100%); /* ff3.6+ */background: -webkit-gradient(linear, left top, right top, color-stop(0%, #004094), color-stop(50%, #0096D9), color-stop(100%, #004094)); /* safari4+,chrome */ background: -webkit-linear-gradient(0deg, #004094 0%, #0096D9 50%, #004094 100%); /* safari5.1+,chrome10+ */background: -o-linear-gradient(0deg, #004094 0%, #0096D9 50%, #004094 100%); /* opera 11.10+ */background: -ms-linear-gradient(0deg, #004094 0%, #0096D9 50%, #004094 100%); /* ie10+ */background: linear-gradient(90deg, #004094 0%, #0096D9 50%, #004094 100%); /* w3c */filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#004094', endColorstr='#004094',GradientType=1 ); /* ie6-9 */}.mark{max-width: 45%;}.mark-input-field{height:30px !important;}</style></head><body><div class="container-fluid"><div class="row"><div class="col-md-4 col-md-offset-4"><div class="loader" style="margin-top:10px; margin-left:80px">付款成功</div><!-- Display the Transaction Details--><div id="show_transactions"><h4><div id="firstName"></div><div id="lastName"></div>谢谢您的订单</h4><div><strong>订单编号:</strong> <span id="transactionId"></span> </div><div><strong>交易类型:</strong><span id="transactionType"></span> </div><div><strong>总⾦额:</strong><span id="amt"></span> </div><div><strong>货币代码:</strong><span id="currencyCode"></span> </div><div><strong>⽀付状态:</strong><span id="paymentStatus"></dispanv> </div></div></div></div></div> <!--Container-Fluid ends here --><!-- jQuery (necessary for Bootstrap's JavaScript plugins) --><script src="https:///jquery.js"></script><script>$( document ).ready(function() {// set back urlvar url = location.pathname.split("/")[1]; url = '/'+url+'/'$('#go_back').attr('href',url);function qs(key) {key = key.replace(/[*+?^$.\[\]{}()|\\\/]/g, "\\$&"); // escape RegEx meta charsvar match = location.search.match(new RegExp("[?&]"+key+"=([^&]+)(&|$)"));return match && decodeURIComponent(match[1].replace(/\+/g, " "));}var orderId = qs("orderId");$.post('<%=request.getContextPath() %>/paypalC/paymentDetails?orderId='+orderId, function( data ) {$("#transactionId").html(data.id);$("#transactionType").html(data.intent);$("#amt").html(data.purchase_units[0].amount.value);$("#currencyCode").html(data.purchase_units[0].amount.currency_code);$("#paymentStatus").html("COMPLETED" == data.status ? "交易完成" : "交易失败");});});</script></body></html>View Code。
PayPal风险控制及案例分享

款项状态(原始交易) Pending (eCheck未结清) Under review(审查中)
Completed(已完成) Held (冻结) On hold – ship now (审核中——立即发货) Reversed(已撤销) Refunded(已退款) Cleared (eCheck已结清) Cancelled(eCheck已取消)
*
如果卖家选择退货退款;
(PayPal将要求买家退回物品) 买家如果提供追踪信息,在线可查物品已经妥投,款项将退还买家; 买家如果退回物品,不能提供追踪信息的,待卖家确认物品收讫后才操作退款流程;
*
风险知识要点:
对于常规的一些物品与描述不符事件,类似事件中物品大小的分歧,在 买卖双方协商无果的情况下,PayPal通常的处理方式是买家退货,卖家 退款; 如果商家对此方式有任何异议,还是建议买卖双方友好协商解决;
信用卡退单类型:
*“未经授权的付款”的信用卡撤单
*“未收到货物”的信用卡撤单 *“商品问题”的信用卡撤单
PayPal最佳集成评分准则
Confidential and Proprietary
13
PayPal风险控制—案例分析
Chargeback (信用卡撤单)
“未经授权的付款”的信用卡撤单
商家需要提供相应的证据证实是持卡人本人完成的购买行为,经由PayPal转 呈买家信用卡公司,由买家信用卡公司做出判定:
送货证明是来自合法货运公司的单证,表明物品已经运送到接收人手中。送货证明 应该具有某种形式的跟踪号,当在线验证时,会显示物品的送货日期,以及包裹的 送货地址。
注意:
1、是否能提供POS和POD 2、妥善保存POS,及时提交 3、在线POD往往不能显示完整地址
PayPal标准版集成全攻略

轻轻松松集成PayPal标准版PP-C2-20061214 最后更新日期:2007年05月10日目录1 注册您的PAYPAL帐号 (2)2 创建“BUY NOW”按钮 (3)3 创建“SHOPPING CART”按钮 (4)3.1创建“A DD TO C ART”按钮 (4)3.2创建“U PLOAD C ART”按钮 (6)4 加密网站付款EWP (9)4.1使用加密网站付款的先决条件 (9)4.2创建加密按钮 (11)5 付款数据传输 PDT (20)5.1什么是PDT (20)5.2如何启用PDT (20)5.3PDT示例代码 (22)6 即时付款通知 IPN (26)6.1什么是即时付款通知IPN (26)6.2如何启用IPN? (27)6.3通知确认 (28)6.4处理IPN的示例代码 (30)7 集成PAYPAL建议 (38)8 附录1: 参考文档及网站 (39)9 附录2:PAYPAL目前支持的货币列表 (40)10 附录3:常见问题 (41)11 附录4:标准变量列表 (42)12附录5:IPN和PDT变量列表 (47)13 附录6:国家或地区ISO3166代码 (55)1 注册您的PayPal帐号如果您已经有PayPal账户了,那恭喜您,您可以直接跳过这部分。
如果还没有PayPal账户,那您可以通过https://访问主页,如图1-1所示,点击“Sign Up”或“Sign Up Now”按钮立即注册一个PayPal账户。
如需帮助,您可以点击主页上方的“帮助”按钮或在您的浏览器中输入https:///cgi-bin/webscr?cmd=_help-ext&source_page=_home获取帮助。
图1-1 PayPal主页注册完以后,您就可以开始您的PayPal之旅了!2 创建“Buy Now”按钮PayPal可以让您轻松地通过您的网站接受单件物品的付款。
“Buy Now”(立即购买)按钮可以在几分钟内实施,让来自PayPal数百万用户的商家和捐赠人以及网络上的任何其他买家轻松访问您的网站。
Shopify 收款方式之Paypal

Shopify收款方式之Paypal在Shopify中,商家经常会面临一个问题:∙如何利用Paypal来收款?∙如何设置Paypal账户来收款?针对这些大家关心的点,今天我们一步一步教大家进行如何设置!点击setting,如下图:点击Payment Providers,如下图:点击之后出现下图:点击select provider,如下图:这里跟大家解释几个选项Express Checkout:你可以使用PayPal的快速结账按钮来收款,在前台结账页面,将会出现Checkout with PayPal按钮。
PayPal Payments Pro:仅适用于美国,加拿大和英国。
所以这里选择PayPal Express Checkout即可。
记住:要设置使用PayPal Express Checkout快速结账,你必须有一个PayPal实名认证过的账号.如果你已经拥有PayPal账号,点击Activate激活.仔细观察上面的截图,这里需要注意到的有几点:You must have a Paypal business accountPaypal特别提示你需要使用Paypal的Business Account才能正常收款。
如果你是个人账户,可以切换成business account。
账户切换只需要提供相关信息即可,没有费用。
Credit Card Rate:Set by Paypal信用卡支付费率,具体费率由Paypal 说了算Transaction Fee:交易手续费在shopify上,不同的店铺套餐(每月基础费用)会有不同的交易费用,比如我的店铺是每月$79美金,那么Transaction Fee的手续费为1.0%这个 1.0%也就是你在Shopify上收到的钱转到Paypal的时候是要收取1%的交易手续费,这个费用是在每个月从信用卡扣款的时候和你的月租费用一起扣除的。
比方说你本月销售额1000美金,那么本月Shopify会从你的信用卡里面扣除的费用总额=79(月租)+1000*1%=89美金。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PayPal快速结账(Express Checkout,EC)集成指南
Lance
如今,已经有越来越多的商户将PayPal列入他们的常用外贸收款工具之中,而其中一些有独立外贸网店的商户,更是会选择将PayPal集成在网站上,提高买家的信任度,一般来说,更建议商家们在网站集成中选择快速结账,可以有效拦截一些风险高的付款行为,从而达到最高限度地提高转换率和降低风险。
产品介绍:
快速结帐(Express Checkout,简称EC),是一种强大的基于API的付款解决方案,可以紧密集成到任何商家的网站。
有了快速结账,您的客户可以使用他们已存储在PayPal上的发货及账单信息,而无需在每次购买时重新输入这些信息。
页面设置:
在您的网站首页,您可以将接受PayPal的图标放在上面,以吸引PayPal用户驻留您的网站。
有数据显示,该图标可以帮助您的网站提高1~3%转换率;
当您的客户选择好商品准备进入支付流程时,选择”Checkout with PayPal”按钮进入快速结帐流程,当然客户也可以选择”Proceed to Checkout”走一般的付款流程。
有数据显示,使用快速结帐可以帮助您的网站提高4~15%的转换率。
提示:当点击按钮”Checkout with PayPal”按钮时,您需要先登陆到PayPal 的测试环境——Sandbox。
具体的方法请参考Sandbox(PDF)文档。
快速结帐允许您的客户直接使用其已经存储在PayPal账户里的地址和账单信息进行结帐,从而大大减少了您的客户在您的网站购买商品时的信息输入量,优化了客户体验,从而提高了购物转换率;对于您来说,在客户还没有真正付款之前您即可拿到客户相关信息,有助于您进行定制化服务。
集成提示:
快速结帐是一种基于API的解决方案,
1) 调用SetExpressCheckout,PayPal将返回一个Token,用于完成后续付款步骤,然后重定向客户的浏览器到PayPal网站允许其登陆;
2) 客户在PayPal网站上确认其资金来源,配送信息和联系方式等;确认后即返回到你们的网站上,这时即可调用GetExpressCheckout获取客户确认的信息;
3) 客户再次确认其付款,最后确认后调用DoExpressCheckout即可完成付款。
该按钮实现的是第一步。
在第二步GetExpressCheckout的过程中可以获取以下信息:用户姓名、PayPal 注册地址、账户认证情况、联系电话、email等等,通过这些获取的信息可以更方便商户们去实施风险控制。
在这些信息中我们可以做一下的一些行为:
1.根据客户所在国家选择合适的物流方式,完善客户体验;
2.根据客户所在国家拦截一些高风险客户的访问;
3.根据客户所在IP地址和PayPal注册地址,送货地址做匹配;
4.针对第一次交易的客户设置最高付款限额(多用于一些虚拟网站);
5.针对未认证账户,做一定购买限制(一个认证的账户相对来讲比较安全);
6.查看PayPal买家地址是否通过认证(不等于账户认证)。
付款界面:
PayPal 登录页面,您的客户既可在左边直接输入其信用卡信息付款,也可在右边登录其PayPal账户付款。
提示:
自定义PayPal的付款页面,使其与您的网站样式一致,可以自定义的内容包括:网站LOGO,标题边框及背景颜色和付款流程背景颜色等。
详细情况可以按照下面的方法访问:
登录您的PayPal账户->用户信息->自定义付款页面
当您的客户从PayPal网站返回来时,您即可从PayPal处获取到该买家确认过的存在PayPal的配送地址,联系方式等信息;在这里您可以根据返回的地址提供合适的配送方式并计算相应运费,客户确认后即可完成最终付款。
有些客户可能比较纠结于买家付款页面的语言问题,下面给大家介绍下一般付款页面语言是由以下几个情况决定的:访问者国家,电脑语言,浏览器语言,LC 语言等等
通过调用GetExpressCheckout即可从PayPal这边获取到买家的PayPal帐号,配送地址,联系方式等相关信息。
PayPal商务顾问Lance
laliu@。