PayPal快速结账(Express Checkout,EC)集成指南
- 格式:docx
- 大小:19.13 KB
- 文档页数:3
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 开发指南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⽀付接⼝⽅式(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标准版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来收款?∙如何设置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美金。
PayPal Express Checkout 整合指南版本 0012015 年 02 月 18 日目錄1.開始使用 Express Checkout (3)1.1.簡介 (3)1.2.Express Checkout 和購物車之間的關係 (5)1.3.使用 Express Checkout 的先決條件 (5)1.4.Express Checkout 組成要素 (6)1.5.實作最簡單的 Express Checkout 整合 (8)1.6.排解 Express Checkout 整合的問題 (19)1.7.Express Checkout 功能 (21)2.Express Checkout 使用者介面要求 (26)2.1.PayPal Mark標誌 (26)2.2.PayPal 結帳按鈕 (27)3.自訂 Express Checkout (29)3.1.PayPal「審核」頁面上的訂單詳細資料 (29)3.2.提供禮品選項 (33)3.3.詢問買家是否同意收到促銷電子郵件 (34)3.4.覆寫客服電話號碼 (35)3.5.加入意見調查問題 (36)3.6.PayPal 頁面風格 (37)3.7.變更地區設定 (39)3.8.運送地址選項 (41)3.9.自動填寫運送和聯絡資訊 (45)3.10.買家在 PayPal 上付款 (46)4.取得 API 憑證(Credentials) (48)4.1.建立和管理標準 API 憑證 (48)4.2.憑證類型 (48)4.3.建立標準 API 憑證 (49)4.4.管理證書憑證 (50)5.讓 Express Checkout 整合正式上線 (55)6.相關的 API 操作 (56)6.1.Express Checkout 的「銷售」付款動作 (56)6.2.Express Checkout 的「授權」付款動作 (56)6.3.Express Checkout 的「訂單」付款動作 (57)6.4.發放退款 (58)6.5.使用 API 冪等 (59)7.將 Express Checkout 與 PayPal SDK 整合 (61)1.開始使用 Express CheckoutExpress Checkout 能讓買家快速輕鬆地使用 PayPal 支付購物款項。
遇到答案跟参考答案一起的题全选参考答案•一、单选题(每题1分,共20题)()是企业通过互联网直接向个人消费者销售产品和提供服务的经营方式,是消费者广泛接触的一类电子商务,也是互联网上最早创立的电子商务模式。
A、2B电子商务模式B、2C电子商务模式C、B2C电子商务模式D、2B电子商务模式参考答案:C1、不属于网络广告比较常见的策略有()•A、网络广告时段策略•B、利益导向策略•C、网络创新策略•D、广告市场策略•答案:C2、B2B电子商务模式的萌芽阶段是()。
•A、1999年•B、2002—2000年•C、1998—2000年•D、1993年•答案:C3、EDI网络传输的数据是( )•A、自由文件•B、平面文件•C、用户端格式•D、EDI标准报文•答案:D4、下列不属于网络广告特点的是()•A、交互性强•B、传播范围有限•C、灵活性和低成本•D、受众数量可准确统计•答案:B5、超级网银是由哪个银行推出的()•A、工商银行•B、中国人民银行•C、农村信用•D、农业银行•答案:B6、下面不是筛选网络中介服务商时要考虑因素的是()•A、卖家和产地•B、成本和信用•C、功能和特点•D、功能和信用••参考答案:A7、网上商店日常运营管理不包括()•A、订单管理•B、销售统计•C、客户查询和商家信用值•D、商品预览•答案:D8、下面不属于网上银行的业务项目是()•A、支付宝•B、国际银行•C、企业银行•D、QQ发红包•答案:B•参考答案:A9、下面不是网络营销与传统营销的区别是()•A、营销理念从未改变•B、沟通方式的改变•C、营销策略的改变•D、沟通能力的改变•答案:A10、我国现行的涉及交易安全的法律法规不包括( )•A、规范交易行为的有关法律•B、规范交易主体的有关法律•C、监督交易行为的有关法律•D、规范交易物品的有关法律•答案:D11、我国互联网时代B2C电子商务模式发展的萌芽阶段是()•A、2000-2002年•B、1999年•C、2003-2004年•D、1995年•答案:B12、按消费者经济收入的不同,划分出不同的目标市场是按()•A、按经济地位划分•B、按人群素质划分•C、按购买量划分•D、按社会地位划分••参考答案:A13、政府通过网络系统来管理经济,并为企业提供快捷方便的服务是指()•A、G2B•B、G2G•C、G2C•D、B2B•参考答案:A14、针对提醒购物的网上购物类型,电子商务网站的最佳策略是()•A、提供商品的详细信息•B、宣传商品的质量和品牌•C、提供方便的商品目录检索•D、做好网上的各种促销活动•答案:D15、互联网时代C2C电子商务平台()、拍拍网、易趣网形成了三足鼎立的局面。
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@。