Skip to main content

Sale APM

Request address

POST

https://sandbox.j-pay.net/pay_index

Test account

Merchant ID:10172

ApiKey: prx5d81g2ytb1mmokl9mohjsmsb09do3

Request parameters

Parameter NameTypeRequiredSign(Y OR N)Parameter Description
pay_memberidStringYYThe platform assigns merchant ID
pay_orderidStringYYMerchant order number
pay_applydateStringYYOrder submission time, format:2016-12- 26 18:18:18
pay_bankcodeStringYYBank code, see table below
pay_notifyurlStringYYAsynchronous notification address. (POST return data)
pay_callbackurlStringYYSynchronization notification address (POST return data)
pay_amountStringYYAmount of the transaction
pay_md5signStringYNPlease see MD5 signature field method
pay_currencyStringYNCurrency code, uppercase letters (USD)
pay_urlStringYNWebsite URL(Subject to review), needs to include http(s)://
pay_typeStringYNFixed value:apm
pay_methodStringNNList of payment methods, If it is empty, the payment list page is returned. Such as: alipay
pay_app_schemeStringNNIf it is not empty, the app url scheme will be redirected first. Such as: myapp://pages/index/index
+pay_productnameStringNNProduct information parameters are composed of the following set of data in JSON format. Please note that parameter names are case-sensitive. This field is filled with a JSON array. Example:[{"sku":"123456789","productName":"Mac Book Pro","productImage":"url","attributes":"Size:US8 Color:blue","price":"11000.00","quantity":" 1"},{"sku":"9876543231","productName":"IPhone 12","productImage":"url","attributes":"Size:US8 Color:blue","price":"11000.00","quantity":" 1"}]
「skuStringNNProduct number (unique)
「productNameStringYNProduct name
「productImageStringNNProduct image URL
「attributesStringNNProduct attributes
「priceStringYNProduct attributes
「quantityStringYNProduct quantity
pay_firstnameStringYNBill name
pay_lastnameStringYNBilling last name
pay_street_address1StringNNBilling address 1
pay_street_address2StringNNBilling address 2
pay_cityStringNNBilling city
pay_postcodeStringNNBilling zip code
pay_stateStringNNBilling State/Province
pay_country_iso_code_2StringYNBilling country
pay_email_addressStringYNBilling email
pay_telephoneStringYNBilling telephone
shipping_firstnameStringNNShipping name
shipping_lastnameStringNNShipping last name
shipping_street_address1StringNNShipping address 1
shipping_street_address2StringNNShipping address 2
shipping_cityStringNNShipping city
shipping_stateStringNNShipping State/Province
shipping_postcodeStringNNShipping zip code
shipping_country_iso_code_2StringNNShipping country
shipping_telephoneStringNNShipping telephone
pay_ipStringYNUser IP address
pay_useragentStringYNUser browser information
pay_languageStringYNLanguage
systemStringYNWebsite system name(Shopyy,Shopline )

Return parameters

Parameter NameTypeParameter Description
statusIntstatus = 0:SUCCESS
status = 1:3d payment
status = 2:failed
msgStringOrder placed successfully or order failed
urlString3D redirectUrl

Return example

Transaction successful : {
"status": 0,
"msg": "transaction success"
}
Transaction failed : {
"status": 2,
"msg": "transaction failed"
}
Redirect/3ds payment successful : {
"status": 1,
"url": "redirectUrl"
}

3DS verification

Jump payment and direct credit card payment require 3DS verification

Synchronous notification parameters:(application/x-www-form-urlencoded)

Parameter NameTypeRequired(Y or N)Parameter Description
paymentStatusStringYSucceeded: success
Fail:fail
Processing:processing
orderIDStringYMerchant order number

Notification example:

Synchronous notification

https://www.xxxx.com/callback.html?paymentStatus=succeeded&orderID=1001

Asynchronous notification parameters:(application/x-www-form-urlencoded)

Parameter NameTypeRequired(Y or N)Parameter Description
memberidStringYMerchant ID
orderidStringYMerchant order number
amountStringYSubmitted order amount
true_amountStringYThe amount actually paid by the buyer
currencyStringYPayment currency
transaction_idStringYTransaction order number
returncodeStringY"00": success
"2":fail
datetimeStringYFormat:20220419000114
signStringNPlease see the verification signature field format
attachString
Array{
["memberid"]=>
string(5) "10012"
["orderid"]=>
string(7) "7758292"
["transaction_id"]=>
string(20) "20230117104641499957"
["amount"]=>
string(5) "85.95"
["true_amount"]=>
string(5) "85.95"
["currency"]=>
string(5) "USD"
["datetime"]=>
string(14) "20230117111809"
["returncode"]=>
string(2) "00"
["sign"]=>
string(32) "48CF5D99A2ADE25DCEF73BC1B1136B9E"
["attach"]=>
string(0) ""
}

Demo

import { md5 } from "js-md5";
import axios from "axios";

const KEY = "prx5d81g2ytb1mmokl9mohjsmsb09do3";
const MEMBER_ID = "10172";
let query = {
pay_memberid: MEMBER_ID,
pay_orderid: "O" + Date.now().valueOf(),
pay_applydate: "2024-12-02 16:48:42",
pay_bankcode: "901",
pay_notifyurl: "https://www.google.com",
pay_callbackurl: "https://www.google.com",
pay_amount: "10.00",
};
let signData = [];
Object.keys(query)
.sort()
.forEach((key) => signData.push(`${key}=${query[key]}`));

signData.push(`key=${KEY}`);
Object.assign(query, {
pay_md5sign: md5(signData.join("&")).toUpperCase(),
pay_url: "https://www.google.com",
pay_currency: "USD",
pay_firstname: "Rodrigo",
pay_lastname: "lopez",
pay_country_iso_code_2: "CL",
pay_email_address: "[email protected]",
pay_telephone: "920508435",
pay_ip: "186.156.221.158",
pay_useragent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.43",
pay_language: "en",
system: "shopyy",
});

axios
.request({
url: "https://sandbox.j-pay.net/pay_index",
method: "post",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
data: query,
})
.then(({ data }) => {
console.log("success", data);
})
.catch((error) => {
console.log("error", error);
});

App Demo

New example of interface parameters added:

pay_app_scheme: jpayapm://payment/result

Demo download:

Kotlin demo

Add (or update) build dependencies

dependencies {
implementation "androidx.browser:browser:1.8.0"
}

JPayAPM.kt

package com.jpay.apm

import android.app.Activity
import android.content.Context
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.util.Log
import androidx.browser.customtabs.*
import org.json.JSONObject
import java.lang.ref.WeakReference

/**
* JPay APM
*/
class JPayAPM {

companion object {
const val PAY_STATUS_UNPAID = 0
const val PAY_STATUS_SUCCESS = 1
const val PAY_STATUS_FAILED = 2
const val PAY_STATUS_CANCEL = 3
private const val TAG = "JPayAPM"
}

private var mActivityRef: WeakReference<Activity>? = null
private var mContextRef: WeakReference<Context>? = null
private var payStatus: Int = PAY_STATUS_UNPAID
private var payCallback: WeakReference<((JSONObject) -> Unit)?> = WeakReference(null)

constructor(activity: Activity, context: Context) {
mActivityRef = WeakReference(activity)
mContextRef = WeakReference(context)
}

/**
* Execute payment
* @param payMethod Payment method (only support googlepay)
* @param payUrl Payment URL
* @param callback Result callback
*/
fun exec(payMethod: String, payUrl: String, callback: ((JSONObject) -> Unit)?) {
Log.d(TAG, "Execute payment: method=$payMethod, url=$payUrl")
payStatus = PAY_STATUS_UNPAID
payCallback = WeakReference(callback)

payByUrl(payUrl)
}

/**
* Handle payment result (main thread callback)
*/
private fun handlePayResult(status: Int, message: String, orderId: String = "") {
payStatus = status
Log.d(TAG, "Payment result: status=$status, msg=$message, orderId=$orderId")

// Build JSON result
val result = JSONObject().apply {
put("status", status)
put("message", message)
put("orderId", orderId)
}

Handler(Looper.getMainLooper()).post {
payCallback.get()?.invoke(result)
payCallback.clear()
}
}

/**
* Open payment URL
*/
private fun payByUrl(payUrl: String) {
val activity = mActivityRef?.get()
val context = mContextRef?.get()
if (context == null) {
handlePayResult(PAY_STATUS_FAILED, "Context is null", "")
return
}
if (activity == null || activity.isFinishing ||
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && activity.isDestroyed)) {
handlePayResult(PAY_STATUS_FAILED, "Activity is null or destroyed", "")
return
}

val uri: Uri
try {
uri = Uri.parse(payUrl)
if (uri.scheme.isNullOrEmpty() || uri.host.isNullOrEmpty()) {
handlePayResult(PAY_STATUS_FAILED, "Invalid URL format: $payUrl", "")
return
}
} catch (e: Exception) {
handlePayResult(PAY_STATUS_FAILED, "Failed to parse URL: ${e.message}", "")
return
}

try {
val intent = CustomTabsIntent.Builder()
.setShowTitle(true)
.build()

intent.launchUrl(activity, uri)
} catch (e: Exception) {
Log.e(TAG, "Failed to launch payment URL: $payUrl", e)
handlePayResult(PAY_STATUS_FAILED, "Failed to launch payment URL: ${e.message}", "")
}
}

/**
* Trigger payment result (for Scheme callback)
*/
fun triggerPayResult(status: Int, message: String, orderId: String = "") {
handlePayResult(status, message, orderId)
}

/**
* Release resources
*/
fun release() {
mActivityRef?.clear()
mContextRef?.clear()
payCallback.clear()
payStatus = PAY_STATUS_UNPAID
}
}