It's recommended to use new alipay api - Open API, read Alipay::Client for more detail.
A unofficial alipay ruby gem.
Alipay official document: https://b.alipay.com/order/techService.htm .
Add this line to your application's Gemfile:
gem 'alipay'
And then execute:
$ bundle
Alipay.pid = 'YOUR_PID'
Alipay.key = 'YOUR_KEY'
Alipay.legacy_gateway_url = 'ALIPAY_GATEWAY_URL_FOR_YOUR_REGION'
#Alipay.sign_type = 'MD5' # Available values: MD5, RSA. Default is MD5
#Alipay.debug_mode = true # Enable parameter check. Default is true.
You can set default key, or pass a key directly to service method:
Service.create_partner_trade_by_buyer_url({
out_trade_no: 'OUT_TRADE_NO',
# Order params...
}, {
pid: 'ANOTHER_PID',
key: 'ANOTHER_KEY',
})
create_partner_trade_by_buyer
Alipay::Service.create_partner_trade_by_buyer_url({ARGUMENTS}, {OPTIONS})
Alipay::Service.create_partner_trade_by_buyer_url(
out_trade_no: '20150401000-0001',
subject: 'Order Name',
price: '10.00',
quantity: 12,
logistics_type: 'DIRECT',
logistics_fee: '0',
logistics_payment: 'SELLER_PAY',
return_url: 'https://example.com/orders/20150401000-0001',
notify_url: 'https://example.com/orders/20150401000-0001/notify'
)
# => 'https://api-sea-global.alipayplus.com/gateway.do?service=create_partner_trade_by_buyer&...'
Guide consumer to this address to complete payment
Key | Requirement | Description |
---|---|---|
out_order_no | required | Order id in your application. |
subject | required | Order subject. |
price | required | Order item's price. |
quantity | required | Order item's quantity, total price is price * quantity. |
logistics_type | required | Logistics type. Available values: POST, EXPRESS, EMS, DIRECT. |
logistics_fee | required | Logistics fee. |
logistics_payment | required | Who pay the logistics fee. Available values: BUYER_PAY, SELLER_PAY, BUYER_PAY_AFTER_RECEIVE. |
return_url | optional | Redirect customer to this url after payment. |
notify_url | optional | Alipay asyn notify url. |
This is not a complete list of arguments, please read official document: http://download.alipay.com/public/api/base/alipayescow.zip .
send_goods_confirm_by_platform
Alipay::Service.send_goods_confirm_by_platform({ARGUMENTS}, {OPTIONS})
Alipay::Service.send_goods_confirm_by_platform(
trade_no: '201504010000001',
logistics_name: 'example.com',
transport_type: 'DIRECT'
)
# => '<!xml version="1.0" encoding="utf-8"?><alipay><is_success>T</is_success></alipay>'
Key | Requirement | Description |
---|---|---|
trade_no | required | Trade number in Alipay system, should get from notify message. |
logistics_name | required | Logistics Name. |
transport_type/create_transport_type | required | Allowed values: POST, EXPRESS, EMS, DIRECT. |
This is not a complete list of arguments, please read official document: http://download.alipay.com/public/api/base/alipayescow.zip .
create_direct_pay_by_user
Alipay::Service.create_direct_pay_by_user_url({ARGUMENTS}, {OPTIONS})
Alipay::Service.create_direct_pay_by_user_url(
out_trade_no: '20150401000-0001',
subject: 'Order Name',
total_fee: '10.00',
return_url: 'https://example.com/orders/20150401000-0001',
notify_url: 'https://example.com/orders/20150401000-0001/notify'
)
Key | Requirement | Description |
---|---|---|
out_order_no | required | Order id in your application. |
subject | required | Order subject. |
total_fee | required | Order's total fee. |
return_url | optional | Redirect customer to this url after payment. |
notify_url | optional | Alipay asyn notify url. |
This is not a complete list of arguments, please read official document: http://download.alipay.com/public/api/base/alipaydirect.zip .
alipay.wap.create.direct.pay.by.user
Alipay::Service.create_direct_pay_by_user_wap_url({ARGUMENTS}, {OPTIONS})
Alipay::Service.create_direct_pay_by_user_wap_url(
out_trade_no: '20150401000-0001',
subject: 'Order Name',
total_fee: '10.00',
return_url: 'https://example.com/orders/20150401000-0001',
notify_url: 'https://example.com/orders/20150401000-0001/notify'
)
Key | Requirement | Description |
---|---|---|
out_order_no | required | Order id in your application. |
subject | required | Order subject. |
total_fee | required | Order's total fee. |
return_url | optional | Redirect customer to this url after payment. |
notify_url | optional | Alipay asyn notify url. |
This is not a complete list of arguments, please read official document: http://download.alipay.com/public/api/base/alipaywapdirect.zip .
create_forex_trade_wap
Alipay::Service.create_forex_trade_wap_url({ARGUMENTS}, {OPTIONS})
Alipay::Service.create_forex_trade_wap_url(
out_trade_no: '20150401000-0001',
subject: 'Order Name',
merchant_url: 'http://example.com/itemback',
total_fee: '10.00', #or rmb_fee, only one
currency: 'USD',
return_url: 'https://example.com/orders/20150401000-0001',
notify_url: 'https://example.com/orders/20150401000-0001/notify'
)
Key | Requirement | Description |
---|---|---|
out_order_no | required | Order id in your application. |
subject | required | Order subject. |
merchant_url | required | The link which customer could jump back to merchant page from Alipay cashier. |
total_fee or rmb_fee | required | Order's total fee. |
currency | required | currency type. |
return_url | optional | Redirect customer to this url after payment. |
notify_url | optional | Alipay asyn notify url. |
This is not a complete list of arguments, please read official document: https://global.alipay.com/product/mobilepayments.html .
refund_fastpay_by_platform_pwd
Alipay::Service.refund_fastpay_by_platform_pwd_url
batch_no = Alipay::Utils.generate_batch_no # refund batch no, you SHOULD store it to db to avoid alipay duplicate refund
Alipay::Service.refund_fastpay_by_platform_pwd_url(
batch_no: batch_no,
data: [{
trade_no: '201504010000001',
amount: '10.0',
reason: 'REFUND_REASON'
}],
notify_url: 'https://example.com/orders/20150401000-0001/refund_notify'
)
# => https://api-sea-global.alipayplus.com/gateway.do?service=refund_fastpay_by_platform_pwd&...
Key | Requirement | Description |
---|---|---|
batch_no | required | Refund batch no, you should store it to db to avoid alipay duplicate refund. |
data | required | Refund data, a hash array. |
notify_url | required | Alipay notify url. |
Key | Requirement | Description |
---|---|---|
trade_no | required | Trade number in alipay system. |
amount | required | Refund amount. |
reason | required | Refund reason. Less than 256 bytes, could not contain special characters: ^ $ | #. |
This is not a complete list of arguments, please read official document: http://download.alipay.com/public/api/base/alipaydirect.zip .
close_trade
Alipay::Service.close_trade({ARGUMENTS}, {OPTIONS})
Alipay::Service.close_trade(
trade_no: '201504010000001'
)
# => '<?xml version="1.0" encoding="utf-8"?><alipay><is_success>T</is_success></alipay>'
# When fail
# => '<?xml version="1.0" encoding="utf-8"?><alipay><is_success>F</is_success> <error>TRADE_STATUS_NOT_AVAILD</error></alipay>'
Key | Requirement | Description |
---|---|---|
out_order_no | optional * | Order number in your application. |
trade_no | optional * | Trade number in alipay system. |
* out_order_no and trade_no must have one.
single_trade_query
Alipay::Service.single_trade_query({ARGUMENTS}, {OPTIONS})
Alipay::Service.single_trade_query(
trade_no: '201504010000001'
)
# => '<?xml version="1.0" encoding="utf-8"?><alipay><is_success>T</is_success>...
Key | Requirement | Description |
---|---|---|
out_trade_no | optional * | Order number in your application. |
trade_no | optional * | Trade number in alipay system. |
* out_trade_no and trade_no must have one.
create_forex_trade
Alipay::Service.create_forex_trade_url({ARGUMENTS}, {OPTIONS})
Alipay::Service.create_forex_trade_url(
out_trade_no: '20150401000-0001',
subject: 'Subject',
currency: 'USD',
total_fee: '10.00',
notify_url: 'https://example.com/orders/20150401000-0001/notify'
)
# => 'https://api-sea-global.alipayplus.com/gateway.do?service=create_forex_trade...'
Key | Requirement | Description |
---|---|---|
out_trade_no | required | Order number in your application. |
subject | required | Order subject. |
currency | required | Abbreviated currency name. |
total_fee | required * | Order total price. |
notify_url | optional | Alipay asyn notify url. |
* total_fee can be replace by rmb_fee.
forex_refund
Alipay::Service.forex_refund_url({ARGUMENTS}, {OPTIONS})
Alipay::Service.forex_refund_url(
out_return_no: '20150401000-0001',
out_trade_no: '201504010000001',
return_amount: '10.00',
currency: 'USD',
reason: 'Reason',
gmt_return: '20150401000000'
)
Key | Requirement | Description |
---|---|---|
out_return_no | required | Refund no, you should store it to db to avoid alipay duplicate refund. |
out_trade_no | required | Order number in your application. |
return_amount | required | Refund amount. |
currency | required | Abbreviated currency name. |
reason | required | Refun reason. |
gmt_return | required * | YYYYMMDDHHMMSS Beijing Time. |
* Auto set Time.now if not set.
account.page.query
Alipay::Service::account_page_query({PARAMS}, {OPTIONS})
Alipay::Service.account_page_query(
page_no: 1,
gmt_start_time: '2015-10-25 00:00:00',
gmt_end_time: '2015-10-26 00:00:00'
)
It's an unpublic api, contact support for permission and document.
batch_trans_notify
Alipay::Service::batch_trans_notify_url({PARAMS}, {OPTIONS})
Alipay::Service.batch_trans_notify_url(
notify_url: 'https://example.com/orders/20150401000-0001/notify',
account_name: '毛毛',
detail_data: '0315006^[email protected]^常炜买家^1000.00^hello',
batch_no: '20080107001',
batch_num: 1,
batch_fee: 1000.00,
email: '[email protected]'
)
#=> 'https://api-sea-global.alipayplus.com/gateway.do?service=batch_trans_notify&...'
Key | Requirement | Description |
---|---|---|
notify_url | required | Alipay asyn notify url. |
account_name | required | Alipay account name of payer. |
detail_data | required | Payment data. |
batch_no | required | Batch transaction number. |
batch_num | required | Batch transaction count. |
batch_fee | required | Batch transaction total amount. |
required | Alipay email account of payer. |
Document: https://doc.open.alipay.com/doc2/detail?treeId=64&articleId=103773&docType=1
notify_verify
Alipay::Notify.verify?({PARAMS}, {OPTIONS})
# Rails
# params except :controller_name, :action_name, :host, etc.
notify_params = params.except(*request.path_parameters.keys)
Alipay::Notify.verify?(notify_params, options = {})
alipay.commerce.qrcode.create
Alipay::Service.create_merchant_qr_code({PARAMS}, {OPTIONS})
create_qr_code_params = {
biz_type: "OVERSEASHOPQRCODE",
biz_data: {
address: "No.278, Road YinCheng, Shanghai, China",
country_code: "CN",
currency: "USD",
secondary_merchant_id: "xxx001",
secondary_merchant_industry: "7011",
secondary_merchant_name: "xxx Store",
store_id: "0001",
store_name: "Apple store",
trans_currency: "USD"
}
}
Alipay::Service.create_merchant_qr_code(create_qr_code_params)
# => 'https://api-sea-global.alipayplus.com/gateway.do?service=alipay.commerce.qrcode.create...'
Key | Requirement | Description |
---|---|---|
notify_url | optional | Alipay asyn notify url. |
biz_type | required | Business type that is defined by Alipay, this case is “OVERSEASHOPQRCODE” |
biz_data | required | Business data. Format:JSON |
Key | Requirement | Description |
---|---|---|
secondary_merchant_industry | required | Business category code of the secondary merchant. |
secondary_merchant_id | required | The unique ID assigned by the partner to identify a secondary merchant. |
secondary_merchant_name | required | Registration legal name of the secondary merchant, shown in the Alipay Wallet and the reconciliation file to identify a secondary merchant. |
store_id | required | The unique ID that is assigned by the partner to identify a store of a merchant. |
store_name | required | The name of the store. |
trans_currency | required | The pricing currency |
currency | required | The currency to settle with the merchant. The default value is CNY. If the pricing currency is not CNY, then the settlement currency must be either CNY or the pricing currency. |
country_code | required | The country code that consists of two letters (alpha-2 code) |
address | required | The address of the store where the code is created. |
This is not a complete list of arguments, please read official document: https://global.alipay.com/docs/ac/global/qrcode_create#biz_data
alipay.commerce.qrcode.modify
Alipay::Service.update_merchant_qr_code({PARAMS}, {OPTIONS})
update_qr_code_params = {
biz_type: "OVERSEASHOPQRCODE",
qrcode: "https://qr.alipay.com/baxxxxx",
biz_data: {
address: "No.278, Road YinCheng, Shanghai, China",
country_code: "CN",
currency: "USD",
secondary_merchant_id: "xxx001",
secondary_merchant_industry: "7011",
secondary_merchant_name: "xxx Store",
store_id: "0001",
store_name: "Apple store",
trans_currency: "USD"
}
}
Alipay::Service.update_merchant_qr_code(update_qr_code_params)
# => 'https://api-sea-global.alipayplus.com/gateway.do?service=alipay.commerce.qrcode.modify...'
Key | Requirement | Description |
---|---|---|
notify_url | optional | Alipay asyn notify url. |
biz_type | required | Business type that is defined by Alipay, this case is “OVERSEASHOPQRCODE” |
biz_data | required | Business data. Format:JSON |
qrcode | required | The returned QR code value after the code is generated successfully. |
Key | Requirement | Description |
---|---|---|
secondary_merchant_industry | required | Business category code of the secondary merchant. |
secondary_merchant_id | required | The unique ID assigned by the partner to identify a secondary merchant. |
secondary_merchant_name | required | Registration legal name of the secondary merchant, shown in the Alipay Wallet and the reconciliation file to identify a secondary merchant. |
store_id | required | The unique ID that is assigned by the partner to identify a store of a merchant. |
store_name | required | The name of the store. |
trans_currency | required | The pricing currency |
currency | required | The currency to settle with the merchant. The default value is CNY. If the pricing currency is not CNY, then the settlement currency must be either CNY or the pricing currency. |
country_code | required | The country code that consists of two letters (alpha-2 code) |
address | required | The address of the store where the code is created. |
This is not a complete list of arguments, please read official document: https://global.alipay.com/docs/ac/global/qrcode_modify#Qb0Hc
alipay.acquire.overseas.query
Alipay::Service.acquirer_overseas_query({PARAMS}, {OPTIONS})
acquirer_overseas_query_params = {
partner_trans_id: "2010121000000002"
}
Alipay::Service.acquirer_overseas_query(acquirer_overseas_query_params)
# => 'https://api-sea-global.alipayplus.com/gateway.do?service=alipay.acquire.overseas.query...'
Key | Requirement | Description |
---|---|---|
partner_trans_id | required | The original partner transaction ID given in the payment request |
alipay_trans_id | optional | The transaction ID assigned by Alipay for the partner's payment request, which follows a mapping relation with the partner field plus the partner_trans_id field. When both of the fields are specified, alipay_trans_id will be verified first. |
Document: https://global.alipay.com/docs/ac/global/overseas_query
alipay.acquire.overseas.spot.refund
Alipay::Service.acquirer_overseas_spot_refund_url({PARAMS}, {OPTIONS})
acquirer_overseas_spot_refund_params = {
partner_trans_id: "2010121000000002",
partner_refund_id: "301012133000002",
currency: "USD",
refund_amount: "0.01"
}
Alipay::Service.acquirer_overseas_spot_refund_url(acquirer_overseas_spot_refund_params)
# => 'https://api-sea-global.alipayplus.com/gateway.do?service=alipay.acquire.overseas.spot.refund...'
Key | Requirement | Description |
---|---|---|
partner_trans_id | required | The original partner transaction ID given in the payment request |
partner_refund_id | required | The refund order ID in the partner system. The value of partner_refund_id cannot be the same as that of partner_trans_id. The partner_refund_id field plus the partner field identifies a refund transaction. |
currency | required | The currency of the refund amount. |
refund_amount | required | Refund amount, which must be less than or equal to the original transaction amount or the left transaction amount if ever refunded. |
is_sync | optional | Indicates that the refund request is processed synchronously or asynchronously with a value of Y or N. The default value is N, which means an asynchronous notification from Alipay is returned to the merchant if the merchant has set the value of the notify_url field when sending the refund request. If the value is set as Y, it means only a synchronous response is returned to the merchant. |
This is not a complete list of arguments, please read official document: https://global.alipay.com/docs/ac/global/spot_refund#92fa0c95
mobile.securitypay.pay
Alipay::Mobile::Service.mobile_securitypay_pay_string({ARGUMENTS}, {OPTIONS})
Alipay::Mobile::Service.mobile_securitypay_pay_string(
out_trade_no: '20150401000-0001',
notify_url: 'https://example.com/orders/20150401000-0001/notify'
subject: 'subject',
total_fee: '10.00',
body: 'text'
)
# => service="mobile.securitypay.pay"&_input_charset="utf-8"&partner=...
Key | Requirement | Description |
---|---|---|
out_trade_no | required | Order number in your application. |
notify_url | required | Alipay asyn notify url. |
subject | required | Order subject. |
total_fee | required | Order total price. |
body | required | Order body, less than 512 bytes. |
* This service only support RSA sign_type.
This is not a complete list of arguments, please read official document: http://download.alipay.com/public/api/base/WS_MOBILE_PAY_SDK_BASE.zip .
alipay.wap.trade.create.direct
Alipay::Wap::Service.trade_create_direct_token({ARGUMENTS}, {OPTIONS}}
token = Alipay::Wap::Service.trade_create_direct_token(
req_data: {
seller_account_name: '[email protected]',
out_trade_no: '20150401000-0001',
subject: 'Subject',
total_fee: '10.0',
call_back_url: 'https://example.com/orders/20150401000-0001',
notify_url: 'https://example.com/orders/20150401000-0001/notify'
}
)
Key | Requirement | Description |
---|---|---|
req_data | required | See req_data ARGUMENTS |
Key | Requirement | Description |
---|---|---|
seller_account_name | required | Alipay seller account. |
out_order_no | required | Order id in your application. |
subject | required | Order subject. |
total_fee | required | Order total price. |
return_url | optional | Redirect customer to this url after payment. |
notify_url | optional | Alipay asyn notify url. |
This is not a complete list of arguments, please read official document: http://download.alipay.com/public/api/base/WS_WAP_PAYWAP.zip .
alipay.wap.auth.authAndExecute
Alipay::Wap::Service.auth_and_execute_url({ARGUMENTS}, {OPTIONS})
Alipay::Wap::Service.auth_and_execute_url(request_token: token)
Key | Requirement | Description |
---|---|---|
request_token | required | Get from trade_create_direct_token |
alipay.security.risk.detect
Alipay::Wap::Service.security_risk_detect({ARGUMENTS}, {OPTIONS})
Alipay::Wap::Service.security_risk_detect({
order_no: '1',
order_credate_time: '1970-01-01 00:00:00',
order_category: 'TestCase^AlipayGem^Ruby',
order_item_name: 'item',
order_amount: '0.01',
buyer_account_no: '2088123123',
buyer_bind_mobile: '13600000000',
buyer_reg_date: '1970-01-01 00:00:00',
terminal_type: 'WAP'
}, {
sign_type: 'RSA',
key: RSA_PRIVATE_KEY
})
Key | Requirement | Description |
---|---|---|
order_no | optional | Order id in your application. |
order_credate_time | optional | Order created time. |
order_category | optional | Categories of Order's items. using ^ as splitter. |
order_item_name | optional | Order subject. |
order_amount | optional | Order item's price. |
buyer_account_no | optional | User id in your application. |
buyer_reg_date | optional | User created time. |
buyer_bind_mobile | optional | User mobile phone. |
terminal_type | optional | The terminal type which user are using to request the payment, can be MOBILE for App, WAP for mobile, WEB for PC. |
notify_verify
Alipay::Wap::Notify.verify?({PARAMS}, {OPTIONS})
# Rails
# params except :controller_name, :action_name, :host, etc.
notify_params = params.except(*request.path_parameters.keys)
Alipay::Wap::Notify.verify?(notify_params)
Bug report or pull request are welcome.
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request
Please write unit test with your code if necessary.
Donate to maintainer let him make this gem better.
Alipay donate link: http://chloerei.com/donate/ .