paymentwall / paymentwall-php
Paymentwall PHP 库。Paymentwall 是全球领先的数字商品和服务货币化平台。
Requires
- php: >=5.2
- ext-curl: *
- ext-json: *
Requires (Dev)
- behat/behat: 2.4.*@stable
README
Paymentwall 是全球领先的数字商品和服务货币化平台。Paymentwall 帮助游戏发行商、交友网站、奖励网站、SaaS 公司和其他多个行业将数字内容和服务的货币化。商家可以通过集成 Paymentwall 的 API 接受来自超过 100 种不同方式(包括信用卡、借记卡、银行转账、短信/移动支付、预付卡、电子钱包、固话支付等)的支付。
要注册 Paymentwall 商户账户,请 点击此处。
Paymentwall PHP 库
此库允许开发人员使用 Paymentwall API(虚拟货币、具有周期性收费的数字商品和虚拟购物车)。
要使用 Paymentwall,您只需注册一个 Paymentwall 商户账户,以便您可以设置一个适用于您网站的 Application。要开通商户账户并设置应用,您可以在 此处注册。
安装
要安装库到您的环境,您有多种选择
-
下载 ZIP 归档
- 下载 ZIP 归档。
- 解压它。
- 将其放置到您的项目中
-
Git Clone
- 使用以下命令克隆存储库:
git clone git@github.com:paymentwall/paymentwall-php.git
- 使用以下命令克隆存储库:
-
Composer
composer require paymentwall/paymentwall-php
然后使用以下代码示例。
代码示例
数字商品 API
初始化 Paymentwall
使用 Paymentwall PHP 库
require_once('/path/to/paymentwall-php/lib/paymentwall.php'); Paymentwall_Config::getInstance()->set([ 'api_type' => Paymentwall_Config::API_GOODS, 'public_key' => 'YOUR_PROJECT_KEY', 'private_key' => 'YOUR_SECRET_KEY' ]);
小部件调用
该小部件是由 Paymentwall 托管的支付页面,其中包含整个支付流程:选择支付方式、完成账单详情以及通过帮助部分提供客户支持。您可以将用户重定向到此页面或通过 iframe 嵌入它。下面是一个渲染 Paymentwall 小部件的 iframe 示例。
$widget = new Paymentwall_Widget( 'user40012', // id of the end-user who's making the payment 'pw', // widget code, e.g. pw; can be picked inside of your merchant account [ // product details for Flexible Widget Call. To let users select the product on Paymentwall's end, leave this array empty new Paymentwall_Product( 'product301', // id of the product in your system 9.99, // price 'USD', // currency code 'Gold Membership', // product name Paymentwall_Product::TYPE_SUBSCRIPTION, // this is a time-based product; for one-time products, use Paymentwall_Product::TYPE_FIXED and omit the following 3 array elements 1, // duration is 1 Paymentwall_Product::PERIOD_TYPE_MONTH, // month true // recurring ) ], ['email' => 'user@hostname.com'] // additional parameters ); echo $widget->getHtmlCode();
Pingback 处理
Pingback 是一个 webhook,用于通知支付已被处理。Pingback 通过 HTTP/HTTPS 发送到您的服务器。要处理 pingback,请使用以下代码
require_once('/path/to/paymentwall-php/lib/paymentwall.php'); Paymentwall_Config::getInstance()->set([ 'api_type' => Paymentwall_Config::API_GOODS, 'public_key' => 'YOUR_PROJECT_KEY', 'private_key' => 'YOUR_SECRET_KEY' ]); $pingback = new Paymentwall_Pingback($_GET, $_SERVER['REMOTE_ADDR']); if ($pingback->validate(true)) { $productId = $pingback->getProduct()->getId(); if ($pingback->isDeliverable()) { // deliver the product } else if ($pingback->isCancelable()) { // withdraw the product } else if ($pingback->isUnderReview()) { // set "pending" status to order } echo 'OK'; // Paymentwall expects response to be OK, otherwise the pingback will be resent } else { echo $pingback->getErrorSummary(); }
虚拟货币 API
初始化 Paymentwall
使用 Paymentwall PHP 库
require_once('/path/to/paymentwall-php/lib/paymentwall.php'); Paymentwall_Config::getInstance()->set([ 'api_type' => Paymentwall_Config::API_VC, 'public_key' => 'YOUR_PROJECT_KEY', 'private_key' => 'YOUR_SECRET_KEY' ]);
小部件调用
$widget = new Paymentwall_Widget( 'user40012', // id of the end-user who's making the payment 'p1_1', // widget code, e.g. p1; can be picked inside of your merchant account [], // array of products - leave blank for Virtual Currency API ['email' => 'user@hostname.com'] // additional parameters ); echo $widget->getHtmlCode();
Pingback 处理
require_once('/path/to/paymentwall-php/lib/paymentwall.php'); Paymentwall_Config::getInstance()->set([ 'api_type' => Paymentwall_Config::API_VC, 'public_key' => 'YOUR_PROJECT_KEY', 'private_key' => 'YOUR_SECRET_KEY' ]); $pingback = new Paymentwall_Pingback($_GET, $_SERVER['REMOTE_ADDR']); if ($pingback->validate(true)) { $virtualCurrency = $pingback->getVirtualCurrencyAmount(); if ($pingback->isDeliverable()) { // deliver the virtual currency } else if ($pingback->isCancelable()) { // withdraw the virtual currency } else if ($pingback->isUnderReview()) { // set "pending" status to order } echo 'OK'; // Paymentwall expects response to be OK, otherwise the pingback will be resent } else { echo $pingback->getErrorSummary(); }
购物车 API
初始化 Paymentwall
使用 Paymentwall PHP 库
require_once('/path/to/paymentwall-php/lib/paymentwall.php'); Paymentwall_Config::getInstance()->set([ 'api_type' => Paymentwall_Config::API_CART, 'public_key' => 'YOUR_PROJECT_KEY', 'private_key' => 'YOUR_SECRET_KEY' ]);
小部件调用
存储产品调用示例(当产品存储在 Paymentwall 中时)
$widget = new Paymentwall_Widget( 'user40012', // id of the end-user who's making the payment 'p1_1', // widget code, e.g. p1; can be picked inside of your merchant account, [ new Paymentwall_Product('product301', 3.33, 'EUR'), // first product in cart new Paymentwall_Product('product607', 7.77, 'EUR') // second product in cart ], ['email' => 'user@hostname.com'] // additional params ); echo $widget->getHtmlCode();
非存储产品调用示例(当产品未存储在 Paymentwall 中时)
$widget = new Paymentwall_Widget( 'user40012', // id of the end-user who's making the payment 'p1_1', // widget code, e.g. p1; can be picked inside of your merchant account, [ new Paymentwall_Product('product301', 3.33, 'EUR', 'Product 1'), // first product in cart new Paymentwall_Product('product607', 7.77, 'EUR', 'Product 2') // second product in cart ], ['email' => 'user@hostname.com', 'flexible_cart_api' => 1] // additional params ); echo $widget->getHtmlCode();
Pingback 处理
require_once('/path/to/paymentwall-php/lib/paymentwall.php'); Paymentwall_Config::getInstance()->set([ 'api_type' => Paymentwall_Config::API_CART, 'public_key' => 'YOUR_PROJECT_KEY', 'private_key' => 'YOUR_SECRET_KEY' ]); $pingback = new Paymentwall_Pingback($_GET, $_SERVER['REMOTE_ADDR']); if ($pingback->validate(true)) { $products = $pingback->getProducts(); if ($pingback->isDeliverable()) { // deliver products from the cart } else if ($pingback->isCancelable()) { // withdraw products from the cart } else if ($pingback->isUnderReview()) { // set "pending" status to order } echo 'OK'; // Paymentwall expects response to be OK, otherwise the pingback will be resent } else { echo $pingback->getErrorSummary(); }
Brick
初始化 Paymentwall
Paymentwall_Config::getInstance()->set([ 'public_key' => 'YOUR_PUBLIC_KEY', 'private_key' => 'YOUR_PRIVATE_KEY' ]);
创建一次性令牌
$tokenModel = new Paymentwall_OneTimeToken(); $token = $tokenModel->create([ 'public_key' => Paymentwall_Config::getInstance()->getPublicKey(), 'card[number]' => '4242424242424242', 'card[exp_month]' => '11', 'card[exp_year]' => '19', 'card[cvv]' => '123' ]); // send token to charge via $token->getToken();
收费
$charge = new Paymentwall_Charge(); $charge->create([ // if generated via backend //'token' => $token->getToken(), // if generated via brick.js 'token' => $_POST['brick_token'], 'email' => $_POST['email'], 'currency' => 'USD', 'amount' => 10, 'fingerprint' => $_POST['brick_fingerprint'], 'description' => 'Order #123' ]); $response = $charge->getPublicData(); if ($charge->isSuccessful()) { if ($charge->isCaptured()) { // deliver s product } elseif ($charge->isUnderReview()) { // decide on risk charge } } else { $errors = json_decode($response, true); echo $errors['error']['code']; echo $errors['error']['message']; } echo $response; // need for JS communication
收费 - 退款
$charge = new Paymentwall_Charge('CHARGE_ID'); $charge->refund(); echo $charge->isRefunded();
订阅
$subscription = new Paymentwall_Subscription(); $subscription->create([ // if generated via backend //'token' => $token->getToken(), // if generated via brick.js 'token' => $_POST['brick_token'], 'email' => $_POST['email'], 'currency' => 'USD', 'amount' => 10, 'fingerprint' => $_POST['brick_fingerprint'], 'plan' => 'product_123', 'description' => 'Order #123', 'period' => 'week', 'period_duration' => 2, // if trial, add following parameters 'trial[amount]' => 1, 'trial[currency]' => 'USD', 'trial[period]' => 'month', 'trial[period_duration]' => 1 ]); echo $subscription->getId();
订阅 - 取消
$subscription = new Paymentwall_Subscription('SUBSCRIPTION_ID'); $subscription->cancel(); echo $subscription->isActive();
签名计算 - 小部件
$widgetSignatureModel = new Paymentwall_Signature_Widget(); echo $widgetSignatureModel->calculate( [], // widget params 2 // signature version );
签名计算 - Pingback
$pingbackSignatureModel = new Paymentwall_Signature_Pingback(); echo $pingbackSignatureModel->calculate( [], // pingback params 1 // signature version );
Mobiamo
初始化 Paymentwall
Paymentwall_Config::getInstance()->set([ 'public_key' => 'YOUR_PROJECT_KEY', 'private_key' => 'YOUR_SECRET_KEY' ]);
获取令牌
$model = new Paymentwall_Mobiamo(); $tokenParams = [ 'uid' => 'test' ] $response = $model->getToken($tokenParams); if (!empty($response['success'])) { //store this token and expire time (default is 86400s) to use in all next requests //example of success response: [ 'success' => 1, 'token' => 'randomString', 'expire_time' => 86400 ] var_dump($response['token']); var_dump($response['expire_time']); } else { var_dump($response['error']); var_dump($response['code']); }
初始化支付
$model = new Paymentwall_Mobiamo(); $initParams = [ 'uid' => 'test', 'amount' => 1, 'currency' => 'GBP', //currency of payment in ISO 4217 format 'country' => 'GB', //country of payment in ISO alpha-2 format 'product_id' => 123, //product id of payment 'product_name' => 'test_product_name', //product name of payment 'msisdn' => '447821677123', //optional - phone number of user in internaltional format 'carrier' => '19', //mandatory in some countries - Given id of user's operator 'mcc' => '262', //optional - mobile country code of user 'mnc' => '007', //optional - mobile netword code of user 'is_recurring' => 1, //optional and only available in some countries - value: 1/0 - determine if this payment is recurring subscription 'period' => 'd', //mandatory if is_recurring = 1 - value: d (day) - w (week) - m (month) - period of the recurring 'period_value' => 1 //mandatory if is_recurring = 1 - value: positive number - value of the recurring period ]; //token returned from get token step above $response = $model->initPayment($token, $initParams); if (!empty($response['success'])) { /** example of success response: [ 'success' => true, 'ref' => 'w118678712', //reference id of payment. 'flow' => 'code', //next flow of this payment. values can be: code/pinless - user send sms contain keyword to shortcode in instructions/ msisdn - user input phone number / redirect - redirect user to redirect_url in intructions 'price' => [ 'amount' => 1, 'currency' => 'GBP', 'formatted' => 'GBP 1.00', 'carriers' => [ 0 => [ 'id' => 19, 'name' => 'O2', ], ], ], 'instructions' => [ 'keyword' => 'test_keyword', //return if flow = code/pinless - sms message content for user to send 'shortcode' => '123456', //return if flow = code/pinless - the number user should send message to 'redirect_url' => 'http://google.com' //return if flow = redirect - url user should be redirected to ] 'product_name' => 'test_product_name', ] */ //Store the parameter ref } else { var_dump($response['error']); var_dump($response['code']); }
处理支付(如果之前的响应有 flow = code/msisdn,则使用此请求)
$model = new Paymentwall_Mobiamo(); $processParams = [ 'uid' => 'test', 'ref' => 'w118678712', //reference id returned from init request 'flow' => 'code', //flow returned from init request 'data' => 'ABCDEF' //value can be: code user received after sending message / phone number of user ]; //token returned from get token step above $response = $model->processPayment($token, $processParams); if (!empty($response['success'])) { /** example of success response: [ 'success' => true, 'flow' => 'redirect', //Only return if this payment requires next processing step. values can be: code - user send keyword to shortcode in instructions/ msisdn - user input phone number / redirect - redirect user to redirect_url in intructions / 'instructions' => [ 'keyword' => 'test_keyword', //return if flow = code/pinless - sms message content for user to send 'shortcode' => '123456', //return if flow = code/pinless - the number user should send message to 'redirect_url' => 'http://google.com' //return if flow = redirect - url user should be redirected to ] ] */ } else { var_dump($response['error']); var_dump($response['code']); }
获取支付信息
$model = new Paymentwall_Mobiamo(); $getPaymentParams = [ 'uid' => 'test', 'ref' => 'w118678712', //reference id returned from init request ]; //token returned from get token step above $response = $model->processPayment($token, $getPaymentParams); if (!empty($response['success'])) { /** example of success response: [ 'success' => true, 'completed' => true, //value: true/false - indicate this payment was already successfull or not 'amount' => 1, 'currency' => "GBP", 'country' => "GB", 'product_name' => "test_product_name", 'msisdn' => "447821677123", 'ref' => "w118678712" ] */ } else { var_dump($response['error']); var_dump($response['code']); }