开始使用


请求接口基地址 https://api.uupay.ph
所有接口都采用 Content-Type:application/json

header 公共参数


参数名称 参数值 是否必填* 描述说明
app-id 638b313bbaba9c9826f6634be2c0a391 商户app-id
method trade/fund/query 执行方式,代收的时候填写-trade 代付的时候填写-fund 其余情况填写-query
sign A134BC0D8FFFF9EF70FC9F6882EF6328 签名,详细算法请查看签名计算文档
channel 10000 在代收/代付的时候必填对应通道,其余情况可不填写

全局错误码


code码 描述说明
-1 服务器错误
-2 数据库错误
20000 产品通道不存在
20001 产品通道权限不足
40001 缺少必选参数
40002 商户不存在
40003 签名错误
40004 订单号重复
40005 请求类型错误
40006 订单不存在
40007 商户余额不足
40008 ip未授权
40009 域名未授权
40010 支付未授权
40011 通道达到最大额度
40012 通道低于最小额度
40013 代付未开启

{host}/api/trade/pay (POST) - 提交代收

body参数


参数名称 参数值 是否必填* 描述说明
out_trade_no 2014072300007148 下游订单号
total_amount 10000 订单总金额,单位为分
subject 大乐透 订单标题
payer_client_ip 127.0.0.1 客户终端ip
notify_url https://api.test.net/atinterface/notify 订单状态通知回调地址
timestamp 2020-10-01 16:00:00 请求发起时间
extend_params {} 扩展参数
extend_params.callback_url https://www.baidu.com 支付成功跳转地址

代码实例


  • PHP
  • GOLANG
$client = new \GuzzleHttp\Client();
$header = [
    'app-id' => '638b313bbaba9c9826f6634be2c0a391',
    'method' => 'trade',
    'channel' => '10000'
];
$body = [
    "out_trade_no" => "2014072300007148",
    "total_amount" => 10000,
    "subject" => "测试商品",
    "payer_client_ip" => "127.0.0.1",
    "notify_url" => "https://api.test.net/atinterface/notify",
    "timestamp" => "2020-10-01 16:00:00",
    "extend_params" => []
];
$header['sign'] = gen_sign(); //请查看签名算法章节
$client->post('/api/trade/pay', [
    'headers' => $header,
    'json' => $body
]);
client := resty.New() //请替换成自己的请求客户端
header := map[string]string{
    "app-id":  "638b313bbaba9c9826f6634be2c0a391",
    "method":  "trade",
    "channel": "10000",
}
body := map[string]any{
    "out_trade_no":    "1231212212212qw1eqeq",
    "total_amount":    1000,
    "subject":         "测试商品",
    "payer_client_ip": "127.0.0.1",
    "notify_url":      "https://api.test.net/atinterface/notify",
    "timestamp":       "2020-10-01 16:00:00",
}
header["sign"] = genSign() //请查看签名算法章节
response,err := client.R().SetHeaders(header).SetBody(body).Post("/api/trade/pay")

返回结果


{
    "code": 200,
    "message": "ok",
    "result": {
        "out_trade_no": "sg556580775387439106",
        "trade_no": "sg557271133284528129",
        "pay_url": "https://daypay.galaxy777.life/api/payment_direct/redirect/sg557271133284528129",
        "qrcode_url": "https://daypay.galaxy777.life/api/payment_direct/redirect/sg557271133284528129"
    }
}

{host}/api/trade/query (POST) - 代收查询

body参数


参数名称 参数值 是否必填* 描述说明
out_trade_no 2014072300007148 下游订单号,不能与系统订单号同时为空
trade_no 2014072300007148 系统订单号,不能与下游订单号同时为空

代码实例


  • PHP
  • GOLANG
$client = new \GuzzleHttp\Client();
$header = [
    'app-id' => '638b313bbaba9c9826f6634be2c0a391',
    'method' => 'query'
];
$body = [
    "out_trade_no" => "2014072300007148",
];
$header['sign'] = gen_sign(); //请查看签名算法章节
$client->post('/api/trade/query', [
    'headers' => $header,
    'json' => $body
]);
client := resty.New() //请替换成自己的请求客户端
header := map[string]string{
    "app-id":  "638b313bbaba9c9826f6634be2c0a391",
    "method":  "query",
}
body := map[string]any{
    "out_trade_no":    "1231212212212qw1eqeq",
}
header["sign"] = genSign() //请查看签名算法章节
response,err := client.R().SetHeaders(header).SetBody(body).Post("/api/trade/query")

返回结果


{
    "code": 200,
    "message": "ok",
    "result": {
        "out_trade_no": "sg556580775387439106",
        "trade_no": "sg557271133284528129",
        "total_amount": 10000,
        "commission":1000,
        "actual_receipt":90000,
        "subject": "测试商品",
        "extend_params": {},
        "timestamp": "2020-10-01 16:00:00",
        "pay_status": 0, //0待支付 1已取消 2支付未通知 3支付已通知 4支付超时
        "success_at": 0 //订单成功时间
    }
}

{host}/api/fund/transfer (POST) - 提交代付

body参数


参数名称 参数值 是否必填* 描述说明
out_trade_no 2014072300007148 下游订单号
trans_amount 10000 订单总金额,单位为分
subject 大乐透 订单标题
notify_url https://api.test.net/atinterface/notify 订单状态通知回调地址
timestamp 2020-10-01 16:00:00 请求发起时间
bank_type 银行类型 可选 gcash 如果是maya的 传递 PH_MYA 银行类型
bank_params {name:'peter','phone':'09','bank_code':'PPSFPHM2XXX'} 银行卡信息(bank_code可选,在打款到银行卡的时候 需要指定银行编码)
extend_params {} 扩展参数

代码实例


  • PHP
  • GOLANG
$client = new \GuzzleHttp\Client();
$header = [
    'app-id' => '638b313bbaba9c9826f6634be2c0a391',
    'method' => 'fund',
    'channel' => '20000'
];
$body = [
    "out_trade_no" => "2014072300007148",
    "trans_amount" => 10000,
    "subject" => "测试代付",
    "notify_url" => "https://api.test.net/atinterface/notify",
    "timestamp" => "2020-10-01 16:00:00",
    "bank_type"=>"gcash",
    "bank_params"=>[
        "name"=>"peter",
        "phone"=>"09"
    ],
    "extend_params" => []
];
$header['sign'] = gen_sign(); //请查看签名算法章节
$client->post('/api/fund/transfer', [
    'headers' => $header,
    'json' => $body
]);
client := resty.New() //请替换成自己的请求客户端
header := map[string]string{
    "app-id":  "638b313bbaba9c9826f6634be2c0a391",
    "method":  "fund",
    "channel": "20000",
}
body := map[string]any{
    "out_trade_no":    "1231212212212qw1eqeq",
    "trans_amount":    1000,
    "subject":         "测试代付",
    "payer_client_ip": "127.0.0.1",
    "notify_url":      "https://api.test.net/atinterface/notify",
    "timestamp":       "2020-10-01 16:00:00",
}
header["sign"] = genSign() //请查看签名算法章节
response,err := client.R().SetHeaders(header).SetBody(body).Post("/api/fund/transfer")

返回结果


{
    "code": 200,
    "message": "ok",
    "result": {
        "out_trade_no": "sg556821243127955459",
        "trade_no": "sg557271660382711808",
        "trans_amount": 10050,
        "trans_status": 0 //0待提交 1审核中 2已打款未通知 3已打款已通知 4已驳回 5已驳回已通知
    }
}

{host}/api/fund/query (POST) - 代付查询

body参数


参数名称 参数值 是否必填* 描述说明
out_trade_no 2014072300007148 下游订单号,不能与系统订单号同时为空
trade_no 2014072300007148 系统订单号,不能与下游订单号同时为空

代码实例


  • PHP
  • GOLANG
$client = new \GuzzleHttp\Client();
$header = [
    'app-id' => '638b313bbaba9c9826f6634be2c0a391',
    'method' => 'query'
];
$body = [
    "out_trade_no" => "2014072300007148",
];
$header['sign'] = gen_sign(); //请查看签名算法章节
$client->post('/api/fund/query', [
    'headers' => $header,
    'json' => $body
]);
client := resty.New() //请替换成自己的请求客户端
header := map[string]string{
    "app-id":  "638b313bbaba9c9826f6634be2c0a391",
    "method":  "query",
}
body := map[string]any{
    "out_trade_no":    "1231212212212qw1eqeq",
}
header["sign"] = genSign() //请查看签名算法章节
response,err := client.R().SetHeaders(header).SetBody(body).Post("/api/fund/query")

返回结果


{
    "code": 200,
    "message": "ok",
    "result": {
        "out_trade_no": "sg556821243127955459",
        "trade_no": "sg557271660382711808",
        "trans_amount": 10050,
        "commission":500,
        "actual_receipt":10000,
        "subject": "测试提交代付",
        "extend_params": {},
        "timestamp": "2023-08-09 00:00:00",
        "trans_status": 0, //0待提交 1审核中 2已打款未通知 3已打款已通知 4已驳回 5已驳回已通知
        "success_at": 0 //订单成功时间
    }
}

{host}/api/custom/query (POST) - 商户查询

代码实例


  • PHP
  • GOLANG
$client = new \GuzzleHttp\Client();
$header = [
    'app-id' => '638b313bbaba9c9826f6634be2c0a391',
    'method' => 'query'
];
$header['sign'] = gen_sign(); //请查看签名算法章节
$client->post('/api/custom/query', [
    'headers' => $header
]);
client := resty.New() //请替换成自己的请求客户端
header := map[string]string{
    "app-id":  "638b313bbaba9c9826f6634be2c0a391",
    "method":  "query",
}
header["sign"] = genSign() //请查看签名算法章节
response,err := client.R().SetHeaders(header).SetBody(body).Post("/api/custom/query")

返回结果


{
    "code": 200,
    "message": "ok",
    "result": {
        "mid": 10000,
        "name": "测试商户001",
        "email": "pay@qq.com",
        "balance": 179800 //余额 分为单位
    }
}

代收回调 POST请求 Content-Type:application/json
服务器收到回调后请返回ok字符即可

回调结果


{
    "out_trade_no": "sg556580775387439106",
    "trade_no": "sg557271133284528129",
    "total_amount": 10000,
    "subject": "测试商品",
    "extend_params": {},
    "timestamp": "2020-10-01 16:00:00",
    "pay_status": 0, //0待支付 1已取消 2支付未通知 3支付已通知 4支付超时
    "success_at": 0,
    "sign":"ABD5138EAA3CD01A34B2BB3ABA287603",//签名请参考签名算法
}

代付回调 POST请求 Content-Type:application/json
服务器收到回调后请返回ok字符即可

回调结果


{
    "out_trade_no": "sg556821243127955459",
    "trade_no": "sg557271660382711808",
    "trans_amount": 10050,
    "subject": "测试提交代付",
    "extend_params": {},
    "timestamp": "2023-08-09 00:00:00",
    "trans_status": 0, //0待提交 1审核中 2已打款未通知 3已打款已通知 4已驳回 5已驳回已通知
    "success_at": 0, //订单成功时间
    "response_text":"其他错误",//代付提交说明文本
    "sign":"ABD5138EAA3CD01A34B2BB3ABA287603",//签名请参考签名算法
}

签名算法

  • PHP
$body = [
    "out_trade_no" => "2014072300007148",
    "total_amount" => 10000,
    "subject" => "测试商品",
    "payer_client_ip" => "127.0.0.1",
    "notify_url" => "https://api.test.net/atinterface/notify",
    "timestamp" => "2020-10-01 16:00:00",
    "extend_params" => []
];

//1.复制body内容
$payload = $body;
$payload['app_id'] = '638b313bbaba9c9826f6634be2c0a391';//商户appid
//2. 参数a-z排序
ksort($payload);
$string = '';
foreach ($payload as $k => $v) {
    //3.空值不参与签名
    if (!empty($v)) {
        //4. 如果参数是对象类型 需要url encode 对应的json字符串
        if (is_array($v)) {
            $v = urlencode(Json::encode($v));
        }
        $string .= $k . '=' . $v . '&';
    }
}
//5.拼接商户secret
$string .= 'app_secret=' . $member['app_secret'];
//6.两次md5后 字符串转大写
return strtoupper(md5(md5($string)));

银行编号

名称
gcash