Website payement
Introduction
To use website payement, merchant should display a button in the webpage to users:
User clicks the button which will redirect to a checkout page, and then scan the qrcode or login to finish the payment.
After this, user will be redirected to merchant's result page. Merchant can check the result, and decide what to display next.
Meanwhile, ScanForPay will notify merchant's server the payment result asynchronously.
Flow
participant Customer
Customer->Merchant: 1. Create order
Merchant->scanforpay: 2. Create order
scanforpay->Payment\nPlatform: 3. Create order
Payment\nPlatform->scanforpay: 4. Retrun transacion\ninformations
scanforpay->Merchant: 5. Return the\npage to pay
Merchant->Customer: 6.Redirect to\nthe page
Customer-->Payment\nPlatform: 7.Pay
Payment\nPlatform->Customer: 8. Display the result
Payment\nPlatform-->scanforpay: 8.Notify the result
scanforpay-->Merchant: 9. Notify the result
Create Order API
Service URL
POST
https://pay.scanforpay.com/api/online/create
Request Body
Name | Parameter | Type | Required | Description |
---|---|---|---|---|
Store ID | storeNo | String (15) | Y | Assigned by scanforpay |
Merchant Order Number | partnerOrderNo | String (32) | Y | Generated by merchant 20180802100000001 |
Wallet | wallet | String (10) | Y | AlipayHK: AlipayHK Alipay: Alipay |
Goods Amount | goodsAmount | int | N | The unit of the transaction amount is the smallest unit of the currency If the currency is RMB, the unit is Fen. So if the transaction amount is 1 Yuan, 100 should be passed;if curreny is JPY, the unit is Japanese Yen |
Extra Amount | goodsExtraAmount | int | N | The unit of the transaction amount is the smallest unit of the currency If the currency is RMB, the unit is Fen. So if the transaction amount is 1 Yuan, 100 should be passed;if curreny is JPY, the unit is Japanese Yen |
Currency | currency | String (10) | Y | |
Transaction Amount | orderAmount | int | Y | The unit of the transaction amount is the smallest unit of the currency If the currency is RMB, the unit is Fen. So if the transaction amount is 1 Yuan, 100 should be passed;if curreny is JPY, the unit is Japanese Yen |
Transaction description | orderTitle | String(100) | N | Transaction description |
Operator ID | operatorId | String(20) | N | 100001 |
Terminal ID | terminalNo | String(20) | N | 100002 |
Notify Url | notifyUrl | String(200) | N | System will call this url when payment succeed. If this is empty, system will not notify the result |
Callback Url | returnUrl | String(200) | N | This page will be called after customers pay successfully or cancel the transation |
Order creation time | orderCreate | String(20) | N | The time when the payment transaction is created. This field is used together with timeout_rule to control the transaction valid time. The time is in milliseconds, which can be obtained by using the Java method System.currentTimeMillis(), since the epoch (January 1, 1970 00:00:00 GMT). Use Beijing time to synchronize with Alipay system.
Example:1586497520310 |
Order timeout rule | timeoutRule | String(10) | N | This parameter specifies the valid time from login to completion. The default value is 12h. If the time in hour is non-integer, convert the value to the time in minutes.
Example:12h 1. The following abbreviations are used to represent time units: m:minute h:hour d:day 2. The decimal point of the parameter value is rejected, for example, 1.5h needs to be converted to 90m. |
Sample
{
"request": {
"header": {
"requestTime": "2018-07-25T18:06:05+08:00",
"partnerNo": "10001",
"signType": "SHA256",
"version": "1.0",
"reqMsgId": "fd03f269-3180-4575-8af0-8f6cf324fb0f"
},
"body": {
"storeNo": "100010000000002",
"partnerOrderNo": "p20180725180605466813",
"wallet":"Alipay",
"currency":"HKD",
"orderAmount": 2100,
"orderTitle": "Consume",
"operatorId": "211918",
"terminalNo": "123456",
"notifyUrl": "http://192.168.31.72:8080/ScanForPay/notify",
"returnUrl": "http://192.168.31.72:8080/ScanForPay/return"
}
},
"signature": "2d2d5c66a67a24b5e13705cc38f34d93c395a7d9e0e4ff9425c9ce07b806a1cc"
}
Response body
Name | Parameter | Type | Required | Description |
---|---|---|---|---|
Response code | code | int(5) | Y | 1:success,Others: Fail |
Response message | msg | varchar (100) | Y | Response message |
Pay Url | payUrl | varchar(200) | Y | Generated by scanforpay. After created the order, user will be redirected the page to pay |
Sample
Successful response sample
{
"response": {
"header": {
"partnerNo": "10001",
"respTime": "2018-07-25T18:06:12+08:00",
"signType": "SHA256",
"version": "1.0",
"reqMsgId": "213ca19e-c75f-450d-9acf-46e860570bb9"
},
"body": {
"code": 1,
"msg": "success",
"payUrl ": "https://www.scanforpay.com/api/online/pay/5a421395def7ffdsa610f2"
}
},
"signature": "0710b2630b467c14b3d54295def7f89be61097c21472547823b43c58f3466b08"
}
Failed response sample
{
"response": {
"header": {
"partnerNo": "10001",
"respTime": "2018-07-25T17:37:14+08:00",
"signType": "SHA256",
"version": "1.0",
"reqMsgId": "c11fe1c7-069b-4399-be00-31830a5de63d"
},
"body": {
"code": 30
"msg": "订单不存在",
}
},
"signature": "5719065ecea463366cbf39b728b9b8cba940365c0c053dd96effde57f7edc1f8"
}
Callback
When a user finishes the payment, scanforpay will call the returnUrl
with POST
parameters as below:
Name | Parameter | Type | Required | Description |
---|---|---|---|---|
Partner Order Number | partnerOrderNo | String(32) | Y | Generated by merchant |
After receiving the callback, merchant should callPay Query to verify whether this payment is done.
Meanwhile, scanforpay will push result to the merchant's server asynchronously, more detail in Notify