3

相关

官 网: www.paypal.com
开发者网站: developer.paypal.com
paypal的sdk是有TLS1.2的硬需求的,请在你的服务器上面启用TLS1.2支持,
可以参考我的这篇文章启用TLS1.2实践
虽然是windows的,但是apache那段应该同样适用于linux都是一样的(apache + php 5.5 + php_openssl)

还有一点就是, 这篇文章只是一个流程的实践, 一切以官方的SDK为准, 请考照sdk进行扩展

流程

1. 注册一个paypal账号

自行注册

2. 创建REST API apps

登陆developer.paypal.com > Dashboard > My Apps & Credentials > REST API apps > Create App > 输入App Name > Create App > 记录下Clien ID和Secret

3. 配置SanBox账户

Dashboard > Sandbox > Accounts > Profile > Change password

facilitator和buyer的密码都改了

4. 使用SDK发起一个支付

下载sdk

git clone https://github.com/paypal/PayPal-PHP-SDK.git paypal
cd paypal
composer update

composer怎么安装不是本文讨论的内容, 请google搜索

支付的流程及代码

  • 创建支付获取支付的地址

  • 跳转到支付地址

  • 支付->成功会跳转到回调地址$site['success']

  1. bb, show code

再说一句, 我是保存到本地的本地地址为 127.0.0.1/paypal/pay.php

<?php
require "vendor/autoload.php"; // load paypal sdk
use \PayPal\Api\Payer;
use \PayPal\Api\Item;
use \PayPal\Api\ItemList;
use \PayPal\Api\Details;
use \PayPal\Api\Amount;
use \PayPal\Api\Transaction;
use \PayPal\Api\RedirectUrls;
use \PayPal\Api\Payment;
use \PayPal\Exception\PayPalConnectionException;
// 需要填写的设置
$order['intent']    = 'sale';
$order['title']     = 'paypal php sdk';
$order['body']      = 'body';
$order['currency']  = 'USD';
$order['price']     = 100;
$order['shipping']  = 8;

$site['success']    = 'http://127.0.0.1/paypal/return.php?result=success';
$site['cancel']     = 'http://127.0.0.1/paypal/return.php?result=failed';

$key['cliend_id']   = '填写你paypal的client_id';
$key['secret']      = '填写你paypal的secret';


// 支付实例
$apiContent = new \PayPal\Rest\ApiContext(
    new \PayPal\Auth\OAuthTokenCredential(
        $key['cliend_id'], $key['secret']
    )
);

$payer = new Payer();
$payer->setPaymentMethod('paypal');

$item = new Item();
$item->setName($order['title'])
    ->setCurrency($order['currency'])
    ->setQuantity(1)
    ->setPrice($order['price']);

$itemList = new ItemList();
$itemList->setItems([$item]);

$details = new Details();
$details->setShipping($order['shipping'])
    ->setSubtotal($order['price']);

$amount = new Amount();
$amount->setCurrency($order['currency'])
    ->setTotal($order['price'] + $order['shipping'])
    ->setDetails($details);

$transaction = new Transaction();
$transaction->setAmount($amount)
    ->setItemList($itemList)
    ->setDescription($order['body'])
    ->setInvoiceNumber(uniqid());

$redirectUrls = new RedirectUrls();
$redirectUrls->setReturnUrl($site['success'])
    ->setCancelUrl($site['cancel']);

$payment = new Payment();
$payment->setIntent('sale');
$payment->setPayer($payer)
    ->setRedirectUrls($redirectUrls)
    ->setTransactions([$transaction]);

try {
    $payment->create($apiContent);
} catch (PayPalConnectionException $e) {
    // get error by $e->getData();
    return false;
}

$pay_url = $payment->getApprovalLink();

// die($pay_url);
header("Location: " . $pay_url);

回调return.php

<?php
var_dump($_GET);
if ('failed' === $_GET['result'])  echo '支付失败';

// 支付成功, 入库
echo "支付成功";


捕获到的回调数据

汇率转换接口

paypal支持但不限于美元(USD) 欧元(EUR) 日元(JPY) 港元(HKD) 台币(TWD), 完整支持请看 Currencies and Currency Codes 至今不支持人民币,为什么是至今呢?以后肯定会支持的
由于paypal不支持人民币(CNY)结算, 所以可能在实际的操作中需要把人民币转换为美元或者港元结算, 这里就需要用到汇率转换接口

我收集了3种汇率转换方式Baidu api NOWAPI Yahoo api
我都没有深度用过,这里也说不上哪个好哪个差,很多人都推荐雅虎接口,相比必有他的可取之处,我百度用起来方便,先百度用着,如果有其他的需求再换口接

Baidu api

http://apistore.baidu.com/api...

NOWAPI

https://www.nowapi.com/api/fi...

Yahoo api

这个接口自行搜索,使用起来不是很方便

我这里提供百度的api的例程, 看代码, 在实际操作中肯定需要再加一些东西, 如超时等异常处理, 这里为了简单好懂这里就没加上

function _currency_service($from, $to, $money){
        $apikey = "你的百度的apikey";
        $url_param = [
            'fromCurrency' => $from,
            'toCurrency'   => $to,
            'amount'       => $money
        ];
        // paypal 支持的货币
        $currency_support = ['AUD', 'CAD', 'CHF', 'CZK', 'DKK', 'EUR', 'GBP', 'HKD', 'HUF', 'JPY', 'NOK', 'NZD', 'PLN', 'SEK', 'SGD', 'USD'];
        if (in_array($to, $currency_support)) return false;
        $ch = curl_init();
        $url = 'http://apis.baidu.com/apistore/currencyservice/currency?' . http_build_query($url_param);
        $header = array( 'apikey: '. $apikey, );

        curl_setopt($ch, CURLOPT_HTTPHEADER  , $header);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        // 执行HTTP请求
        curl_setopt($ch , CURLOPT_URL , $url);
        $res = curl_exec($ch);
        if($ret = json_decode($res)){
            $cny = $ret->retData->convertedamount;
            return $cny;
        }
        return false;
    }

优de良
333 声望13 粉丝

好好写代码