国际支付,收款方式—西联,paypal,cashrun cashpay,信用卡渠道

 

电子商务外贸商家,外贸soho。的收款方式主要有:西联,paypal,Cashrun Cashpay,信用卡,TT。

西联汇款   费用:单笔视地区(14-85usd)
优点:实时汇兑,周期3-7天
缺点:费率比较贵

paypal           费率:2.9%~~3.9%  
费用:
1.无开户费及使用费
2.每笔收取0.3$银行系统占用费
3.提现每笔收取35$
4.如果跨境每笔收取0.5%的跨境费
优点:
1. 国际付款通道满足了部分地区客户付款习惯
2. 账户与账户之间产生交易的方式。可以买可以卖,双方都拥有
3:美国EBAY旗下,国际知名度较高,尤其受美国用户信赖。
缺点:
1:PAYPAL用户消费者(买家)利益大于PAYPAL用户卖家(商户)的利益.双方权利不平衡
2: 电汇费用,每笔交易除手续费外还需要支付交易处理费         
3: 账户容易被冻结.商家利益受损失 很多做外贸的朋友都遇到过问题
安全性:
财务信息防火墙,防止未经授权的付款。

Cashrun铠世宝cashpay费率:2-3.2%   根据产品,行业。在费率在区间   支持:paypal,yellowpay,paysafecard,clickandbuy,sofort等支付网关
费用: 
无开户费及使用费,无附加费
优点:
1.加快偿付速度(2~~3天)结算快
2.降低汇率风险
3.提供更多支付网关的选择,支持你喜欢的币种提现。
4.支持10种语言,24/7全天候服务
5.瑞士银行担保,拥有强大的国际背景。
6.一站式服务平台解决商家的所有问题。
缺点:
国内知名度不高
安全性:
不只降低退款率而更专注客户盈利,RTA(风险动态分析)RPA(风险预测评估)及实时升级的IT程序是您交易、资料数据更安全。
特点:安全,快速,费率合理!

信用卡收款:
环讯支付(IPS):国际信用卡 费率:4%  
费用:1.开通费¥7000 
2.使用费¥7000
3.单笔收取10%保证金6个月滚动返还
4.可开通对私结算:开通费2000,交易手续费200元/笔。
优点:
依托环球实业控股,2003开始从事国际支付,品牌知名度在国内较高。
缺点:
国际支付方式单一只能通过信用卡,未与国外银行及第三方支付平台合作
安全性:
1.自主研发A.N.T.信用卡反欺诈系统,通道成功80%~~90%
2.每月拒付率不能超过3%,超过通道马上关闭

E汇通(ECPSS)费率:5%~~8%   费用:不同的通道费用不同,以最普通的非3D为例
1.开通费¥3000
2.使用费¥5000
3.单笔收取10%保证金6个月滚动返还
4.不足¥5000提现每笔手续费¥5.5
5.拒付每笔要收取处理费20$和罚款50$
国际支付起步较晚2010年下半年才开始立项,方式单一
安全性:
1. 与国外风险控制公司共同研发风险防范系统
2.有拒付率要求,出现拒付无赔付,只作为第三方协助解决问题。
信用卡支付有点:1. 便捷。2. 实时。3. 安全。
信用卡支付缺点:1. 交易金额受限制。2. 存在拒付风险。

TT电汇       费用:各自承担所在地的银行费用。买家银行会收取一道手续费,由买家承担。卖家公司的银行有的也会收取一道手续费,就由卖家来 
承担。跟据银行的实际费率计算。(参考费用USD25-40左右)。
优点   1.收款迅速,几分钟到账收款方式有哪些,包括有线下外贸收款方式的
       2. 先付款后发货,保证商家利益不受损失
缺点    1. 先付款后发货,老外容易产生不信任paypal,信用卡外贸收款方式优缺点的 .
        2. 客户群体小,限制商家的交易量
        3. 数额比较大的,手续费高

Magento Paypal支付接口无法传递运费

尽管Magento1.5已经出来了。。但现在大部分站还是继续1.4.0.1的。

Magento官方也公布了这个版本的多个BUG,其中一个是Magento1.4.0.1使用Paypal支付接口
的时候,如果客户先注册再放入购物车结算, 一切正常。 如果游客身份先放入购物车,然后再注册,去结算,就会在支付的时候 少算运费,后台的一切数值都正常,都是带运费的。但是就是Paypal收到的是不带运费的。

对着BUG修复文档处理了一下,问题可以解决。记录一下。。

app/code/core/Mage/Paypal/Helper/Data.php

         $shippingDescription = '';
-        if ($salesEntity instanceof Mage_Sales_Model_Order) {
-            $discountAmount = abs(1 * $salesEntity->getBaseDiscountAmount());
-            $shippingDescription = $salesEntity->getShippingDescription();
-            $totals = array(
-                'subtotal' => $salesEntity->getBaseSubtotal() - $discountAmount,
-                'tax'      => $salesEntity->getBaseTaxAmount(),
-                'shipping' => $salesEntity->getBaseShippingAmount(),
+        $discountAmount = abs(1 * $salesEntity->getBaseDiscountAmount());
+        $shippingDescription = $salesEntity->getShippingDescription();
+        $totals = array(
+            'subtotal' => $salesEntity->getBaseSubtotal() - $discountAmount,
+            'tax'      => $salesEntity->getBaseTaxAmount(),
+            'shipping' => $salesEntity->getBaseShippingAmount(),
+            'discount' => $discountAmount,
 //                'shipping_discount' => -1 * abs($salesEntity->getBaseShippingDiscountAmount()),
-            );
-        } else {
-            $address = $salesEntity->getIsVirtual() ? $salesEntity->getBillingAddress() : $salesEntity->getShippingAddress();
-            $discountAmount = abs(1 * $address->getBaseDiscountAmount());
-            $shippingDescription = $address->getShippingDescription();
-            $totals = array (
-                'subtotal' => $salesEntity->getBaseSubtotal() - $discountAmount,
-                'tax'      => $address->getBaseTaxAmount(),
-                'shipping' => $address->getBaseShippingAmount(),
-                'discount' => $discountAmount,
-//                'shipping_discount' => -1 * abs($address->getBaseShippingDiscountAmount()),
-            );
-        }
+        );

app/code/core/Mage/Paypal/Model/Standard.php

     public function getStandardCheckoutFormFields()
     {
+        $orderIncrementId = $this->getCheckout()->getLastRealOrderId();
+        $order = Mage::getModel('sales/order')->loadByIncrementId($orderIncrementId);
         $api = Mage::getModel('paypal/api_standard')->setConfigObject($this->getConfig());
-        $quote = $this->getQuote();
-        $api->setOrderId($this->getCheckout()->getLastRealOrderId()) // TODO reserved order id
-            ->setCurrencyCode($quote->getBaseCurrencyCode())
+        $api->setOrderId($orderIncrementId)
+            ->setCurrencyCode($order->getBaseCurrencyCode())
             //->setPaymentAction()
             ->setNotifyUrl(Mage::getUrl('paypal/ipn/standard'))
             ->setReturnUrl(Mage::getUrl('paypal/standard/success'))
-            ->setCancelUrl(Mage::getUrl('paypal/standard/cancel'))
-        ;
+            ->setCancelUrl(Mage::getUrl('paypal/standard/cancel'));
 
         // export address
-        $isQuoteVirtual = $quote->getIsVirtual();
-        $address = $isQuoteVirtual ? $quote->getBillingAddress() : $quote->getShippingAddress();
-        if ($isQuoteVirtual) {
+        $isOrderVirtual = $order->getIsVirtual();
+        $address = $isOrderVirtual ? $order->getBillingAddress() : $order->getShippingAddress();
+        if ($isOrderVirtual) {
             $api->setNoShipping(true);
-        } elseif ($address->getEmail()) {
+        }
+        elseif ($address->getEmail()) {
             $api->setAddress($address);
         }
 
-        list($items, $totals, $discountAmount, $shippingAmount) = Mage::helper('paypal')->prepareLineItems($quote, false, true);
+        list($items, $totals, $discountAmount, $shippingAmount) = Mage::helper('paypal')->prepareLineItems($order, false, true);
         // prepare line items if required in config
         if ($this->_config->lineItemsEnabled) {
             $api->setLineItems($items)->setLineItemTotals($totals)->setDiscountAmount($discountAmount);
         }
         // or values specific for aggregated order
         else {
-            $grandTotal = $quote->getBaseGrandTotal();
-            if (!$isQuoteVirtual) {
+            $grandTotal = $order->getBaseGrandTotal();
+            if (!$isOrderVirtual) {
                 $api->setShippingAmount($shippingAmount);
                 $grandTotal -= $shippingAmount;
             }

app/code/core/Mage/Paypal/Model/Api/Standard.php

     protected $_exportToRequestFilters = array(
         'amount'   => '_filterAmount',
-        'shipping' => '_filterAmount',
+        'shipping' => '_filterAmount'
     );
         'amount' => 'amount_%d',
     );
 
+    protected $_lineItemExportItemsFilters = array(
+         'qty'      => '_filterQty'
+    );
+

app/code/core/Mage/Paypal/Model/Api/Abstract.php

     protected $_lineItemExportTotals = array();
     protected $_lineItemExportItemsFormat = array();
+    protected $_lineItemExportItemsFilters = array();


         foreach ($items as $item) {
             foreach ($this->_lineItemExportItemsFormat as $publicKey => $privateFormat) {
                 $value = $item->getDataUsingMethod($publicKey);
+                if (isset($this->_lineItemExportItemsFilters[$publicKey])) {
+                    $callback   = $this->_lineItemExportItemsFilters[$publicKey];
+                    $value = call_user_func(array($this, $callback), $value);
+                }
                 if (is_float($value)) {
                     $value = $this->_filterAmount($value);
                 }

     {
         return http_build_query($request);
     }
+
+    /**
+     * Filter qty in API calls
+     * Paypal note: The value for quantity must be a positive integer. Null, zero, or negative numbers are not allowed.
+     *
+     * @param float|string|int $value
+     * @return string
+     */
+    protected function _filterQty($value)
+    {
+        return intval($value);
+    }

乳此,Magento Paypal支付接口

ThinkPHP使用Paypal支付接口的模块开发

<?php
/**
 * 
 * PaypalAction.class.php
 * 
 * ThinkPHP Paypal支付接口模块
 * 
**/


class PaymentAction extends Action { 

/** 
* 自己的paypal账号 
*/ 
private $account = 'admin@gmail.com';

/** 
* paypal支付网关地址 
*/ 
private $gateway = 'https://www.paypal.com/cgi-bin/webscr?'; 

public function index() { 
	echo '<a href="'.U('Payment/order').'">Payment this order.</a>'; 
} 

/** 
  * 生成订单并跳转到Paypal进行支付 
  */ 
public function order() { 
	/** 
	* 自己的逻辑代码 
	* 判断是否登录、购买的哪个商品、购物车等等逻辑 
	* 当然可以调用Model更简单点 
	* 这里不在赘述 
	*/ 
	/** ...... **/ 

	$order_info	= array();	// 初始化订单数据 
	$order_id	= uniqid();	// 按照自己的规则生成订单号入库 

	/** 
	* 订单包含哪几种商品、谁买的、什么时间、几件 
	*/ 
	$order_info['order_id']		= $order_id; 
	$order_info['member_id']	= Session::get('member_id'); 
	/** .... **/ 

	$order = D('Order'); 

	if( $order->createOrder($order_info) ) { 
		unset($order,$order_info); 
		// 初始化准备提交到Paypal的数据 
		$pp_info = array();
		// 告诉Paypal,我的网站是用的我自己的购物车系统 
		$pp_info['cmd']			= '_xclick';
		// 告诉paypal,我的(商城的商户)Paypal账号,就是这钱是付给谁的 
		$pp_info['business']	= $this->account;
		// 用户将会在Paypal的支付页面看到购买的是什么东西,只做显示,没有什么特殊用途,
		// 如果是多件商品,则直接告诉用户,只支付某个订单就可以了 
		$pp_info['item_name']	= "支付订单:{$order_id}";
		$pp_info['amount']		= '13'; // 告诉Paypal,我要收多少钱 
		// 告诉Paypal,我要用什么货币。这里需要注意的是,由于汇率问题,
		// 如果网站提供了更改货币的功能,那么上面的amount也要做适当更改,
		// paypal是不会智能的根据汇率更改总额的 
		$pp_info['currency_code']	= 'USD';
		// 当用户成功付款后paypal会将用户自动引导到此页面。
		// 如果为空或不传递该参数,则不会跳转 
		$pp_info['return']		= 'http#//www.sjolzy.cn/index.php/payment/finish';	
		$pp_info['invoice']	= $order_id; 
		$pp_info['charset']	= 'utf-8'; 
		$pp_info['no_shipping']	= '1'; 
		$pp_info['no_note']		= '1'; 
		// 当跳转到paypal付款页面时,用户又突然不想买了。则会跳转到此页面 
		$pp_info['cancel_return']	= 'http#//www.sjolzy.com/index.php/product/view/pid/3';	
		// Paypal会将指定 invoice 的订单的状态定时发送到此URL 
		// (Paypal的此操作,是paypal的服务器和我方商城的服务器点对点的通信,用户感觉不到)
		$pp_info['notify_url']	= 'http#//www.sjolzy.com/index.php/payment/notify/orderid/'.$order_id; 
		$pp_info['rm']	= '2'; 
		$paypal_payment_url = $this->gateway.http_build_query($pp_info); 
		echo "<a href='{$paypal_payment_url}'>Go Paypal!</a>"; 
		unset($pp_info); 
	} else { 
		$this->error(L('order_create_fail')); 
	} 
} 

public function finish() { 
	$this->success('购买成功'); 
} 

public function notify() { 
	// 由于这个文件只有被Paypal的服务器访问,所以无需考虑做什么页面什么的,
	// 这个页面不是给人看的,是给机器看的 
	$order_id = (int) $_GET['orderid']; 
	$order_info = D('Order')->getOrderDetail($order_id); 

	// 由于该URL不仅仅只有Paypal的服务器能访问,其他任何服务器都可以向该方法发起请求。
	// 所以要判断请求发起的合法性,也就是要判断请求是否是paypal官方服务器发起的 

	// 拼凑 post 请求数据 
	$req = 'cmd=_notify-validate';// 验证请求 
	foreach ($_POST as $k=>$v){ 
		$v = urlencode(stripslashes($v)); 
		$req .= "&{$k}={$v}"; 
	} 

	$ch = curl_init(); 
	curl_setopt($ch,CURLOPT_URL,'http://www.paypal.com/cgi-bin/webscr'); 
	curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 
	curl_setopt($ch,CURLOPT_POST,1); 
	curl_setopt($ch,CURLOPT_POSTFIELDS,$req); 
	$res = curl_exec($ch); 
	curl_close($ch); 

	if( $res && !emptyempty($order_info) ) { 
		// 本次请求是否由Paypal官方的服务器发出的请求 
		if(strcmp($res, 'VERIFIED') == 0) { 
			/** 
			* 判断订单的状态 
			* 判断订单的收款人 
			* 判断订单金额 
			* 判断货币类型 
			*/ 
			if(($_POST['payment_status'] != 'Completed' && $_POST['payment_status'] != 'Pending')
			 OR ($_POST['receiver_email'] != $this->account)
			  OR ($_POST['mc_gross'] != 13)
			   OR ('USD' != $_POST['mc_currency'])) { 
			// 如果有任意一项成立,则终止执行。由于是给机器看的,所以不用考虑什么页面。直接输出即可 
				exit('fail'); 
			} else {// 如果验证通过,则证明本次请求是合法的 
				D('Order')->finishOrder($order_id);// 更改订单状态 
				exit('success'); 
			} 
		} else { 
			exit('fail'); 
		} 
	} 
} 
} 

?>

更多Paypal参数的使用参考:PayPal支付接口的PHP开发方式

PayPal支付接口的PHP开发方式

 

解析PayPal支付接口的PHP开发方式

大家都知道PHP代码的便捷之处和用法,那么今天我们就向大家详细的讲解如何运用PHP来开发PayPal支付接口的相关内容,希望对大家有所帮 助。PayPal 快速、安全而又方便,是跨国交易的首选在线付款方式。现在PayPal支付接口可以和国内大部分信用卡关联,可以实现国人的跨国交易收支。

所谓paypal ipn(Instant Payment Notification),就是Paypal开发的一种能主动通知第三方卖家系统交易状态的一种机制。IPN的原理很简单,就是当产生了一个交易之后, 交易状态发生变化时,如用户已经付款、或者退款、撤销时,Paypal利用常用的HTTP POST方式,将交易的一些变量提交给网站的某个页面(称之为IPN Handler),当这个页面接受到请求时候,将这些数据原封不动加上一个指示验证的cmd=_notify-validate,POST回Paypal 的接口地址,如果数据正确,那么Paypal返回字符串VERIFIED,否则为INVALID,如果结果为VERIFIED,那么你的程序就可以使用这 些数据进行操作。

开设Sandbox帐号

但代码的调试是一件很痛苦的事情,因为作为第三方开发人员,不可能开两个帐号,每次测试还要之间交易一些钱,所以Paypal专门开发了 Sandbox给 开发人员进行开发,首先到https://developer.paypal.com/注册一个开发帐号,好了之后再进入Sandbox建立测试用的 Paypal虚拟帐号(至少应该建立一个Business的和一个Personal的),这 种账号注册方法和Paypal的流程一样,信息可以是假的,包括银行帐号、信用卡(其实Paypal Sandbox会自动生成一些随机的号码)。接下来需要激活Paypal Sandbox的虚拟帐号,注意,这里不管你在Paypal Sanbox注册时填什么邮件地址,有任何发送到虚拟帐号所填邮箱的邮件都存会在开发帐号的管理界面中的Email页(导航栏上有)中。登录 Sandbox的虚拟Paypal环境,还需要验证虚拟帐号的银行,这里可以随便填,然后通过Add Funds来给账户充值(想填多少填多少 920-203 920-533 )。然后,还需要激活IPN的选项,在Business的那个账户的Profile设置页面中,点击,然后点击Edit按钮,打开IPN,这里如果你使用 的是固定的IPN Handle,可以直接将地址填入。

接下来,我们测试的时候,应该将Paypal接口的地址设置为https://www.sandbox.paypal.com/cgi-bin /webscr

基本的流程

当客户向您付款时,PayPal将向位于指定 URL (type=”hidden” name=”notify_url” value=” “)的服务器发送一个通知。此通知中将包括您的客户的所有付款信息(例如,客户名称、金额),以及一段加密代码。当服务器收到通知时,它随后会将该信息 (包括加密代码)发送回安全的PayPal URL。PayPal将通过检查加密字符串对交易进行身份验证。这种将 IPN 数据传回PayPal的操作防止了“欺骗”,因此您可以确保 IPN 来自PayPal。在进行验证时,PayPal会将其合法性的确认信息发送回您的服务器。

提示:要启用即时付款通知,您将需要输入一个 URL,通过它您可以接收到来自您的用户信息的通知。

启用了即时付款通知后,每次当您接收付款时您的服务器都会收到一个通知,此通知将以隐藏的“FORM POST”的方式发送到指定的 URL,并将包括所有付款信息。此页面的底部列出了通知的 FORM 变量。

每次收到来自PayPal的 IPN 时,您必须在实施订单之前完成如下所述的通知确认过程。确认列出的信息将可确保交易合法。

通知确认IPN

为了确保付款已进入您的PayPal账户,您必须验证用作“receiver_email”的电子邮件地址是否已在您的PayPal账户中注册并得 到确认。

服务器收到即时付款通知后,您将需要通过构建一个发送到PayPal的 HTTP POST 对其进行确认。您的 POST 应发送到https://www.paypal.com/cgi-bin/webscr

您必须完全按照收到表单变量时的原样发送所有收到的表单变量。您还需要将一个值为“_notify-validate”的名为“cmd”变量(例 如,cmd=_notify-validate)附加到 POST 字符串。

PayPal将回复该 POST,并在回复的正文中包含一个单词“VERIFIED”或“INVALID”。当您收到 VERIFIED 回复时,您需要在实施订单之前执行若干检查:

确认“payment_status”为“Completed”,因为系统也会为其他结果(如“Pending”或“Failed”)发送 IPN。

检查“txn_id”是否未重复,以防止欺诈者重复使用旧的已完成的交易。

验证“receiver_email”是已在您的PayPal账户中注册的电子邮件地址,以防止将付款发送到欺诈者的账户 。

检查其他交易详情(如物品号和价格),以确认价格未改变完成了以上检查后,您可以使用 IPN 数据更新您的数据库,并处理购物。

如果收到“无效”通知,则应将其视为可疑通知,并应对其进行调查。

主要参数:

向PayPal提交粘贴代码时,应包括以下 4 个隐藏变量及一张图片,这就是说,您粘贴到PayPal的最短必需代码应如下:

 <form action="https://www.paypal.com/row/cgi-bin/webscr" method="post">
 <input type="hidden" name="cmd" value="_xclick">  // "_xclick" 立即购买
 <input type="hidden" name="business" value="you@youremail.com">   //PayPal账户上的电子邮件地址
 <input type="hidden" name="item_name" value="Item Name"> //物品名称(或购物车名称)
 <input type="hidden" name="currency_code" value="USD"> //定义币种以标示货币变量 值可以为 "USD"、"EUR"、"GBP"、"CAD"、"JPY"。
 <input type="hidden" name="amount" value="0.00"> //物品的价格(购物车中所有物品的总价格,因为是_Xclick模式)
<input type="image" src="http://www.paypal.com/zh_XC/i/btn/x-click-but01. gif" name="submit" alt="请使用PayPal付款!">
 </form>

可用变量

business 您的PayPal账户上的电子邮件地址

quantity 物品数量。大于 1 时,会与金额相乘

item_name 物品名称(或购物车名称)。必须是字母数字字符,最多为 127 个字符

item_number 用于跟踪付款的可选传递变量。必须是字母数字字符,最多为 127 个字符

amount 物品的价格(购物车中所有物品的总价格)

shipping 该物品的运送成本

shipping2 每增加一件物品所需的运送成本

handling 手续费

tax 基于交易的税额。如果使用该变量,传递值将覆盖所有用户信息税收设置(不管买家所在位置)。

no_shipping 送货地址。如果设为 “1″,则不会要求您的客户提供送货地址。该变量为可选项;如果省略或设为 “0″,将提示您的客户输入送货地址

cn 可选标签,会在提示栏上显示(最多 40 个字符)

no_note 为付款加入提示。如果设为 “1″,则不会提示您的客户输入提示。该变量为可选项;如果省略或设为 “0″,将提示您的客户输入提示。

on0 第一选项栏名称。最多 64 个字符

os0 第一组选项值。最多 200 个字符。”on0″ 必须定义,以便识别 “os0″。

on1 第二选项栏名称。最多 64 个字符

os1 第二组选项值。最多 200 个字符。”on1″ 必须定义,以便识别 “os1″。

custom 决不会向您的客户显示的可选转递变量。可用于跟踪存货

invoice 决不会向您的客户显示的可选转递变量。可用于跟踪账单号

notify_url 仅与 IPN 一起使用。发送 IPN Form Post 的互联网 URL

return 您的客户完成付款后将返回的互联网 URL

cancel_return 您的客户取消付款后将返回的互联网 URL

image_url 您要用作图标的图片的互联网 URL,图片大小为 150 X 50 像素

cs 设置您的付款页面的背景色。如果设为 “1″,背景色将为黑色。该变量为可选项;如果省略或设为 “0″,背景色将为白色

扩展变量

PayPal 允许您粘贴扩展变量,条件是将改变以下 “cmd” 值:

到:

通过上述 “cmd” 值修改,您还可使用以下变量:

扩展变量

email 客户的电子邮件地址

first_name 客户的名。必须是字母数字字符,最多为 32 个字符

last_name 客户的姓。必须是字母数字字符,最多为 64 个字符

address1 客户地址所在国家或地区。必须是字母数字字符,最多为 100 个字符

address2 客户地址第二行。必须是字母数字字符,最多为 100 个字符

city 客户地址所在城市。必须是字母数字字符,最多为 100 个字符

state 客户地址所在州。必须是正式的 2 个字母缩写

zip 客户地址的邮政编码

night_phone_a 客户夜间联系电话号码的区号

night_phone_b 客户夜间联系电话号码前三位

day_phone_a 客户白天联系电话号码的区号

day_phone_b 客户白天联系电话号码前三位

提示:若要更改”用户信息”中的默认运费和手续费设置,请转至您的用户信息,编辑您的运费计算,然后点击”允许采用基于交易的运费”复选框。

将单个物品传递给PayPal

如果您的第三方购物车可设置成向PayPal传递单个物品,有关物品的信息将加入买家和卖家的记录日志和系统通知中。要加入该物品的信息,您需要将 HTML 格式元素粘贴至PayPal购物车流程的新版本。该过程与 #1 节”将总购物车数量传递给PayPal”描述的非常相似,不同之处在于:

将 “cmd” 变量设置到 “_cart”

更换必要的 HTML 行

添加称为 “upload” 的新变量

在 <表格> 和 标签之间新增以下行:

定义物品明细

对于以下各特定物品参数,定义与通过您的合作商购物车购买的各物品对应的一组新值。将 “_x” 附加到变量名称,其中 x 是物品号码,从 1 开始,每加入一物品增加一。

item_name_x (物品 #x 需要)购物车中物品 #x 的名称。必须是字母数字字符,最多为 127 个字符

item_number_x 与购物车中物品 #x 关联的可选传递变量。必须是字母数字字符,最多为 127 个字符

amount_x (物品 #x 需要)物品 #x 的价格

shipping_x 运送物品 #x 的第一件(数量 1)的成本

shipping2_x 每增加一件运送物品 #x(数量 2 或更多)所需的运送成本

handling_x 物品 #x 的处理成本

on0_x 物品 #x 的第一选项栏名称。最多 64 个字符

os0_x 物品 #x 的第一组选项值。最多 200 个字符。”on0_x” 必须定义,以便识别 “os0_x”。

on1_x 物品 #x 的第二选项栏名称。最多 64 个字符

os1_x 物品 #x 的第二组选项值。最多 200 个字符。”on1_x” 必须定义,以便识别 “os1_x”。

为购物车中每件物品重复此设定

为您的买家购物车中的各物品加入以上表格中的一组必需的变量和任何选项变量。购物车中的第一物品必须用以 “_1″ 结束的参数定义,如 “item_name_1″、”amount_1″ 等。同样,第二物品应用变量 “item_name_2″、”amount_2″ 等命名。提示:”_x” 值必须以一为单位按序递增,以便识别。如果从 item #1 跳到 item #3 而不定义 item #2,则第三个物品会被忽略。

要指定币种:所有货币变量(金额、运费、运费 2、手续费、税款)将以粘贴在付款上的 “currency_code” 变量指定的币种显示。因为其不是随物品不同的,无需向变量名称附加 “_x”。如果没有粘贴 “currency_code” 变量,我们将假定所有货币变量值为美元。.

电子商务系统使用paypal支付接口的程序流程及通信接口

magento使用paypal支付接口测试

电子商务系统使用paypal支付接口的程序流程及通信接口

 

magento使用paypal支付接口测试

关于paypal在线支付的信息可以直接访问http://www.paypal.com。

一般电子商务系统实现的流程
如下: 
客户在系统内下订单 -> 将订单的金额信息提交到paypal网站 -> 客户在paypal上付款 -> paypal将客户的付款完成信息发送给电子商务系统 -> 系统收到paypal信息后确定客户订单已经付款 -> 进行发货等后续流程。

 

从这个流程中可以看到系统与paypal的通信尤其关键,可以实现订单的自动付款确认。 

(1)如何调用paypal接口
?(将订单的金额信息提交到paypal网站) 

<form name="paypal" action
="https://www.paypal.com/cgi-bin/webscr
" method="post">

<input type="hidden" name="cmd
" value="_xclick">

<input type="hidden" name="business
" value="paypal@xxx.com"><!--这里填写你的paypal账户email-->

<input type="hidden" name="item_name
" value="order information"><!--这里填写客户订单的一些相关信息,当客户连到paypal网站付款的时候将看到这些信息-->

<input type="hidden" name="amount
" value="220.00"><!--订单的总金额信息-->

<input type="hidden" name="currency_code
" value="USD"><!--订单总金额对应的货币类型 ,客户可以用其他币种来付款,比如这里订单币种是美元USD,客户可以用欧元EUR来付款,由paypal根据当前汇率自动实现币种之间的换算-->  

<input type="hidden" name="on0" value="customerId"><!-- 自定义的参数1 -->

<input type="hidden" name="os0" value="stephen"><!-- 对应上面自定义参数1对应的值 -->

<input type="hidden" name="on1" value="address"><!-- 自定义的参数2 -->

<input type="hidden" name="os1" value="shanghai china"><!-- 对应上面自定义参数2对应的值 -->

<input type="hidden" name="notify_url
" value="http://www.xxx.com/notifyurl.jsp?order_id=23876412"><!--这里告诉paypal付款的通信url,即当客户付款后调用这个url通知系统-->

<input name="Paypal" type="button" value="Go to Paypal" onclick="javaScript:this.form.submit();"></td>

</form>

在生成上面的paypal表单时,其中的[cmd],[action],[business],[amount],[currency_code],[notify_url]
参数设置绝对不能出错,[cmd]和[action]指定paypaly接口类型,[business]出错,你将收不到客户的付款,[amount]与[currency_code]关系到订单的金额,[notify_url]是系统与paypal的付款通知接口url。  


当客户下单后看到上面的页面后,就可以通过设置的按钮[Go to Paypal]连接到paypal.com网站,然后登录并进行付款。 (但一般我们会通过js触发表单的自动提交)

 

 

(2)paypay
将付款信息返回给系统 

当客户付款后,paypal就会自动调用上面表单提供的[notify_url]

//系统接收成功返回200 OK 否则返回fail

 

如果确认收到paypal发来的客户付款信息,则返回"200 OK",这样子paypal就知道系统已经收到信息了;否则返回"fail",这样paypal会过一段时间后再次发来。其实,只有当paypal收到"200 OK"的返回信息后才会停止发送付款信息,否则会自动的每隔一段时间就调用上面 

的[notify_url]通信接口。 

 

 

(3)系统处理paypal
发来的付款信息

程序流程
为:

//判断paypal付款账户是否正确

//判断订单号  

//循环收取paypal发来的所有参数信息  

//这里添加对收到信息的处理:一般是将这些信息存入数据库,然后对客户的订单进行处理.   

 

这样系统可以自动对客户订单的付款情况进行跟踪,更快捷的进行订单处理。 

 

 

Ps,

paypay允许的币种 
AUD Australian Dollar 
CAD Canadian Dollar 
CHF Swiss Franc 
CZK Czech Koruna 
DKK Danish Krone 
EUR Euro 
GBP Pound Sterling 
HKD Hong Kong Dollar 
HUF Hungarian Forint 
JPY Japanese Yen 
NOK Norwegian Krone 
NZD New Zealand Dollar 
PLN Polish Zloty 
SEK Swedish Krona 
SGD Singapore Dollar 
USD U.S. Dollar 

 

paypal返回参数

mc_gross交易收入
address_status地址信息状态
paypal_address_idPaypal地址信息ID
payer_id付款人的Paypal ID
tax税收
address_street通信地址
payment_date交易时间
payment_status交易状态
charset语言编码
address_zip邮编
first_name付款人姓氏
address_country_code国别
address_name收件人姓名
custom自定义值
payer_status付款人账户状态
business收款人Paypal账户
address_country通信地址国家
address_city通信地址城市
quantity货物数量
payer_email付款人email
txn_id交易ID
payment_type交易类型
last_name付款人名
address_state通信地址省份
receiver_email收款人email
address_owner尚未公布/正式启用
receiver_id收款人ID
ebay_address_id易趣用户地址ID
txn_type交易通告方式
item_name货品名称
mc_currency货币种类
item_number货品编号
payment_gross交易总额[只适用于美元情况]
shipping运送费