法币 (印尼盾) 代付下单

# 代码示例

  • 代码示例仅供参考,具体参数说明请参考请求参数说明
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import java.util.Map;
import java.util.TreeMap;
public class TopPayDemo {
  private static final String MCH_ID = "S820211021094748000001";  // 商户号
  private static final String PLAT_PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2JoMfFqLsSJjAiCahEnlP3aRj8yCT+WHzR+VvPBTw9S1i7iYWb+MY09CG/HYuHF4+IxshXDJygmndxKf/esuwPybS8mAd//yubHpmZsmBqg1FffT8VH1APa6ZRWASUp4U01ZrbCCp35QA8FuWrJGMJxGx4xk7KUtV2yujxC8noQIDAQAB";  // 平台公钥
  private static final String MCH_PRIVATE_KEY = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAJU8gKFKD0luIYx7X8+JRdCIE0UDBctS6LjXxWLEv/EO7jDBTid6zYP1KmNgpd2DAWWtBFBSQ+gcNwVZZSBHJiSDqVvvJVs2FEbeBvfdv4X93+IYRAXksBasSW5Tpdshbo82pVL4V7wuKCuFLk9UxBHbpQjWAbfyF66RmwIbZD71AgMBAAECgYBjPe7UU2nDDSfmQg0++CyjNjqKRC5QPfxhH6w1uF1kMueXKJWOj42n2RutJpJmsj31nY8m0u4xpsG4HvCu/GGSFhhKZCHLvzp41oY2ubYj9nuFNU//81LycQjulWo2y0UUBY0k2piEt+SwPaiUNbT6nMxNMjlnjRe2okp/3rw+KQJBANG3YlZWoVbCEqzy64bJJLxiPsCA5ErGB0NzRGitq44xkhqGtR8ZZQyVz40pruNa58d73O2xyJSy5+fmZGn4E+sCQQC2LBnguj0CSCKub0mPDcunTTz9V79VXBBZdlB1/YGmRUx2s4sQrJNZS7rL4EqBQ3maIRnG+s+AXCSTfsYrV6CfAkEAxugnVfpelhoGepEAgNuggyivmgfl/2Gpm/jk5l/qOjib+ZrQiQmeBPzGWX4yiSM8eMDrP2sC8r5pJFMp5DRONwJBAJ4n4XuSFJ9jgwCPy3vvzSv9SYLk6E6yM9uHdUlKgoGYzk6Lh6M9QFuY/J49plFdBDiEnj16yCU3WeXXfTJpzB8CQQDMNMR/rIOTE9xGybS3mlQbt22AUnO6XhupWcckEKW4nPGxATwYBQzCY3i/9FTGN0vA+9ZPC2cwHtNxI2kXf3Vp";  // 商户私钥
  private static final String cashUrl = "https://id-openapi.toppay.asia/gateway/cash";
  private static final String cashNotify = "http://host:port/notify";

  public static void main(String[] args) throws Exception {
    cash();
  }
  private static void cash() throws Exception {
    Map<String, String> requestParams = new TreeMap<>();
    requestParams.put("merchantCode", MCH_ID);
    requestParams.put("orderNum", "186888188666"); // 商户订单号
    requestParams.put("method", "Transfer"); // 收款方式(Transfer-银行卡)
    requestParams.put("orderType", "0"); // 订单类型(0-法币交易,1-数字货币交易)
    requestParams.put("money", "125"); // 订单金额,不支持小数位
    requestParams.put("feeType", "0"); // 手续费类型(0-帐内扣除,1-帐外扣除)
    requestParams.put("dateTime", "20200101235959"); // 时间戳 格式 yyyyMMddHHmmss
    requestParams.put("number", "2021071209403321313122"); // 客户银行卡号
    requestParams.put("bankCode", "014"); // 印尼银行编码:参考附录I 代付
    requestParams.put("name", "test cash name");  // 客户名称
    requestParams.put("mobile", "082122965511"); // 客户手机号
    requestParams.put("email", "[email protected]"); // 客户邮箱
    requestParams.put("description", "test cash"); // 描述
    requestParams.put("notifyUrl", cashNotify);  // 回调地址
    StringBuilder stringBuilder = new StringBuilder();
    for (String key : requestParams.keySet()) {
      stringBuilder.append(requestParams.get(key));  // 拼接参数
    }

    String keyStr = stringBuilder.toString(); // 得到待加密的字符串
    System.out.println("keyStr:" + keyStr);
    String signedStr = TopPayRequestUtil.privateEncrypt(keyStr, TopPayRequestUtil.getPrivateKey(MCH_PRIVATE_KEY)); // 私钥加密
    requestParams.put("sign", signedStr);

    String postJson = new Gson().toJson(requestParams);
    System.out.println("Post Json Params:" + postJson);

    String responseJson = TopPayRequestUtil.doPost(cashUrl, postJson); // 发送 post json请求
    System.out.println("Response Msg:" + responseJson);

    boolean pass = TopPayRequestUtil.verifySign(new Gson().fromJson(responseJson, JsonObject.class), PLAT_PUBLIC_KEY); // 签名验证
    if (pass) {
      // ... 签名验证通过,执行正常的业务逻辑
    } else {
      // ... 签名验证错误
    }
  }
}
<?php
// 平台公钥,从密钥配置中获取
// platform public key, from Secret key config
$platPublicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiaKBgQCcEUIvQ/5L+SWbHOeR8VFeZvLbUk7V7OeEAQlQwIVLSZMTef3KtsOKKAsUYPf/aAcKRzZZXECODsPQiDPcdZvM/rFkgrFWkR7lPjTj5SiPxGaiK2Z2sne7A8aDF7fV/D7lfmEwNdZ7FWKVEB84/81BHnlGUwb5HpRTISG+boSO6wIDAQAB';
// 商户私钥,商户自己生成
// mchchant private key
$mchPrivateKey = 'MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMigm7rtWnTeNagwFzGTH+Uw1ypbiy7VhIoFJbgSYSSHdCaXWdT/l2+2fQlEYgAETVZ/IXB29MCnrf3O0dwRFXiipIbsm5zyqSLiS6cKXe8zN1/PlQWUbEt5wyWm0GADB/4bV6eu6gA7sGXmjQqrzfKZkcie3aK7+7ry1NFxTI51AgMBAAECgYEAklqXQAVlt1tiSQ7L3J425jp6u6uMHN4lkYmvuleuBbfKQ1yla3wIPLYjAF+iHeEFidOz0Rb19JRdmIkHDkJoJg2W27LvO6RdUwzgRnsuA3OuNz97w08B3aXXbPmB91nTFjKSlUsbh3IQWP71noxW+iKn844EW5hC5Gvn4L3quAECQQDrz1r0VKIbBSBB2aLuz1XyD/TBT2aRhvOKf0XtTRiQhNjtJxoQmvNbbhvUwj8an7HyCuihAbdbrC2ymFFyOSDZAkEA2c4Yudi48C6COrroi1cWgPlEFeGJXP/V1k5loZ1n2vstYAGPhAB4wUnFBLDvMqaBzWJt7MRkiazT8KnBQCDY/QJAMXpNlEyZwt+deBOpO0BnwSWV7mWxmMFfImU4D+WITPbC7aexsWBBxaJh1o93XCe715RwYTAR//stj3akSDoyaQJAa4FKuxC51/Nc3Fg9R+modeiTLqmv/3NXvPvdNjRXesLX1rduex0wfVdII9ShfEKrdxDKaT9W0NyzD+r6NAkCkQJBAMAnTgPYf0f7rh417GdoP7R7Nwi8KBKwPHlmfRukibOQlKt9xjqpsKJwglLn8pcnXbYbswXIdqzuBvIGAe3OWNg=';
// 商户ID,从商户信息中获取
// merchent ID from idntask, from User info
$merchantCode = 'YOUR MERCHANT ID';
// 商户订单号
// Merchant system unique order number
$orderNum = 'T'.date("YmdHis",time());
// 支付方式 
// Payment method 
$method = 'Transfer';
// 订单类型(0-法币交易)
$orderType = '0';
// 出款金额 withdraw money
$money = '20000';
// 手续费类型(0-帐内扣除,1-帐外扣除)
$feeType = '1';
// 时间戳 格式 yyyyMMddHHmmss
$dateTime = date("YmdHis",time());
// 客户银行卡号
$number = '123456';
// 银行编码(详情参考文档底部)
$bankCode = '014';
// 在付款确认页面显示的转账对象
// Display name on bank confirmation display
$name = 'Neo';
// 手机号码
// Customer's mobile number
$mobile = '082112345678';
// 邮箱
// Customer's email address
$email = '[email protected]';
// 描述
// The virtual account description
$description = 'Test Withdraw';
// 回调地址
// url for callback
$notifyUrl = 'http://example.com/callback';
$params = array(
  'merchantCode' => $merchantCode,
  'orderType' => $orderType,
  'method' => $method,
  'orderNum' => $orderNum,
  'money' => $money,
  'feeType' => $feeType,
  'dateTime' => $dateTime,
  'number' => $number,
  'bankCode' => $bankCode,
  'name' => $name,
  'mobile' => $mobile,
  'email' => $email,
  'notifyUrl' => $notifyUrl,
  'description' => $description
);

ksort($params);
$params_str = '';
foreach ($params as $key => $val) {
  $params_str = $params_str . $val;
}

$sign = pivate_key_encrypt($params_str, $mchPrivateKey);
$params['sign'] = $sign;
$params_string = json_encode($params);
$url = 'https://id-openapi.toppay.asia/gateway/prepaidOrder';
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $params_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
  'Content-Type: application/json',
  'Content-Length: ' . strlen($params_string))
);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

//execute post
$request = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if($httpCode == 200)
{
  $result = json_decode($request, true);
  echo "platRespCode :". $result['platRespCode'] . "\n";
  echo "platRespMessage :". $result['platRespMessage'] . "\n";
  echo "platOrderNum :". $result['platOrderNum'] . "\n";
  echo "orderNum :". $result['orderNum'] . "\n";
  echo "status :". $result['status'] . "\n";
  echo "statusMsg :". $result['statusMsg'] . "\n";
  echo "money :". $result['money'] . "\n";
  echo "fee :". $result['fee'] . "\n";
  echo "feeType :". $result['feeType'] . "\n";
  echo "bankCode :". $result['bankCode'] . "\n";
  echo "number :". $result['number'] . "\n";
  echo "name :". $result['name'] . "\n";
  echo "description :". $result['description'] . "\n";
  echo "platSign :". $result['platSign'] . "\n";
  $decryptStr = public_key_decrypt($result['platSign'], $platPublicKey);
  echo "decryptStr :". $decryptStr . "\n";
}
else {
  echo $httpCode;
}

function pivate_key_encrypt($data, $pivate_key)
{
  $pivate_key = '-----BEGIN PRIVATE KEY-----'."\n".$pivate_key."\n".'-----END PRIVATE KEY-----';
  $pi_key = openssl_pkey_get_private($pivate_key);
  $crypto = '';
  foreach (str_split($data, 117) as $chunk) {
    openssl_private_encrypt($chunk, $encryptData, $pi_key);
    $crypto .= $encryptData;
  }
  return base64_encode($crypto);
}

function public_key_decrypt($data, $public_key)
{
  $public_key = '-----BEGIN PUBLIC KEY-----'."\n".$public_key."\n".'-----END PUBLIC KEY-----';
  $data = base64_decode($data);
  $pu_key =  openssl_pkey_get_public($public_key);
  $crypto = '';
  foreach (str_split($data, 128) as $chunk) {
    openssl_public_decrypt($chunk, $decryptData, $pu_key);
    $crypto .= $decryptData;
  }
  return $crypto;
}
暂无示例
暂无示例
暂无示例
暂无示例

# 请求地址

  • 请求方式:POST
  • 请求地址:https://id-openapi.toppay.asia/gateway/cash

# 请求参数

注:所有的参数中,不要填写中文!!!

参数 类型 必填 描述 示例
merchantCode String Y 商户ID,在商户平台-个人中心-个人信息中获取 S820211021094748000001
orderType string(10) Y 订单类型 0-法币交易
method string(10) Y 收款方式 Transfer
orderNum String Y 商户订单号 10000001
money String Y 代付金额 (不支持小数点位,请勿传小数) 150000
feeType String Y 手续费类型
0:代付金额内扣除
1:手续费另计
0
bankCode String Y 银行编号 查看支持的银行代码
number String Y 客户银行卡号 12312431241
name String Y 客户名称 Jack
mobile String Y 用户手机号码 081234567890
email String Y 用户邮箱 [email protected]
notifyUrl String Y 回调地址 https://123123.com
dateTime String N 时间戳 (格式:yyyyMMddHHmmss) 20200101235959
description String N 按请求参数返回 代付下单
sign String Y 签名 Yg+ePvTFhiRrARcZKBcRG0l89rqisPIuZQStYqBIwSMPaqvqbc3dFevgS9jt

# 请求报文示例

{
  "merchantCode": "S820211021094748000001",
  "orderType": "0",
  "method": "Transfer",
  "orderNum": "186888188666",
  "money": "50000",
  "feeType": "1",
  "bankCode": "014",
  "number": "2021071209403321313122",
  "name": "test cash name",
  "mobile": "082122965511",
  "email": "[email protected]",
  "notifyUrl": "your notify url",
  "dateTime": "2021-07-12 09:41:00",
  "description": "test cash",
  "sign": "Yg+ePvTFhiRrARcZKBcRG0l89rqisPIuZQStYqBIwSMPaqwH77qRXI1J+jElOBpa"
}

# 响应参数

参数 类型 必填 描述 示例
platRespCode String Y 请求业务是否成功 FAIL:失败\SUCCESS:成功
platRespMessage String Y 接口响应信息提示 请求成功
platOrderNum String Y 平台订单号 PI1453242857400963072
orderNum String Y 商户订单号 23645782
status int Y 订单状态 查看订单状态描述
statusMsg String Y 订单状态信息 Apply
money String Y 代付金额 150000
fee String Y 手续费 12
feeType String Y 手续费类型
0:订单内扣除
1:手续费另计
1
bankCode String N 银行编号 查看支持的银行代码
number String Y 客户银行卡号 12312431241
name String Y 客户名称 Jack
description String Y 按请求参数返回 代付下单
platSign String Y 签名 PI1453242857400963072

# 响应报文示例

{
  "platRespCode": "SUCCESS",
  "platRespMessage": "Request success",
  "platOrderNum": "W0620220119174331000001",
  "orderNum": "186888188666",
  "status": 0,
  "statusMsg": "Apply",
  "money": "50000",
  "fee": "7",
  "feeType": "0",
  "bankCode": "014",
  "number": "2021071209403321313122",
  "name": "test cash name",
  "description": "test cash",
  "platSign": "E5uNF7B9NXyhtlRo2I7/KVHN4Sbz0c3VbwCLpH3vjUpv6Cai+bmJA/Q8dVE2RJRe1+dsbzg=="
}

# 代付异步通知

  • 进行验签时,要用 商户后台-收付款配置-API配置 中提供的平台公钥进行解密!!!
  • 进行验签时,以实际回调的参数为准,不要验签固定的参数。
  • 订单的最终状态以通知的 status 为准!!!
  • TopPay结果异步通知后,需响应 SUCCESS 字符串,不包含引号,不是 Json 格式。否则TopPay将继续向下游发起5次通知。

# 通知参数

参数 描述 示例
platOrderNum 平台订单号 BK_1563278763273
orderNum 商户订单号 T1231511321515
money 代付金额 100000
feeType 手续费类型
0:订单内扣除
1:手续费另计
1
fee 手续费 500
name 客户名称 Neo
number 客户银行卡号 45649849659456
bankCode 到账银行 查看支持的银行代码
status 订单状态 查看订单状态描述
statusMsg 订单状态描述 Payout Success
description 订单描述 商户上传原样返回
platSign 平台签名 ja6R8eukQY9jc8...

# 异步通知报文示例

{
  "platOrderNum": "W0620220119174331000001",
  "orderNum": "186888188666",
  "money": "50000",
  "fee": "7",
  "feeType": "0",
  "name": "test cash name",
  "number": "2021071209403321313122",
  "bankCode": "014",
  "status": "2",
  "statusMsg": "SUCCESS",
  "description": "test cash",
  "platSign": "LGEpz2LjbZ6Iyvn+zLc/+t26AaH0aEhHVD62lSCdo6XIkAg86AUncCvmym62wVoE3r2+dHnv27qi/01UQDcqFK8DYioRCcydYSjB4QRVezG3fcZlhWrACmWGacnXkE7p5zChL7pK5h0HuBhbo1zKt4FunQR6QMmcBVfv7YfB3W0"
}