创建 Transfer 对象

你可以请求一个新的 transfer 对象发起一次企业付款。如果支付失败,请检查错误信息,一般是由于账户余额不足引起的。

使用测试模式的 API Key,则不会发生真实交易。测试模式需要调用 查询 接口更新 test 模式下transfer对象的状态,Ping++ 才会发送 Webhooks 通知。

注:1、渠道为 wx_litealipayunionpayallinpayjdpay 时,强制要求 签名 (Pingplusplus-Signature),需在管理平台上 配置商户公钥 ;2、微信企业付款区分"企业付款到零钱"和"企业付款到银行卡",使用此功能时请确保在微信处开通相应产品。此外,使用微信服务商模式商户暂不支持企业付款。

请求参数描述
app[id] expandable required string转账使用的 app 对象的 idexpandable 可展开,查看如何获取App ID
channel required string付款使用的第三方支付渠道名称。目前支持 wx(微信 App)、wx_pub(微信 JSAPI)、wx_lite(微信小程序)、alipay(支付宝)、unionpay(银联电子代付)、allinpay(通联代付)、jdpay(京东代付)和balance(余额)。
order_no required string付款使用的商户内部订单号。wx/wx_pub/wx_lite 规定为 1 ~ 32 位不能重复的数字字母组合; alipay 为 1 ~ 64 位不能重复的数字字母组合;unionpay 为 1 ~ 16 位的纯数字; allinpay 为 20 ~ 40 位不能重复的数字字母组合,必须以签约的通联的商户号开头(建议组合格式:通联商户号 + 时间戳 + 固定位数顺序流水号,不包含+号); jdpay 为 1 ~ 64 位不能重复的数字字母组合;balance 为 1 ~ 64 位不能重复的数字字母组合,支持"-"和"_"。
amount required int付款金额,相关渠道的限额,请查看帮助中心。单位为对应币种的最小货币单位,例如:人民币为分。
type required string付款类型,转账到个人用户为 b2c,转账到企业用户为 b2b(wx、wx_pub、wx_lite 和 balance 渠道的企业付款,仅支持 b2c)。
currency required string三位 ISO 货币代码,目前仅支持人民币: cny
recipient conditional string接收者 id,使用微信企业付款到零钱时必传,为用户在 wxwx_pubwx_lite 渠道下的 open_id,使用微信企业付款到银行卡时不需要此参数;渠道为 alipay 时,若 type 为 b2c,为个人支付宝账号,若 type 为 b2b,为企业支付宝账号;渠道为 unionpay 时不支持传该参数;渠道为 jdpayallinpay 时可不传该参数。渠道为 balance 时,为用户在当前 app 下的用户 id。
description required string备注信息,最多 255 个 Unicode 字符。渠道为 unionpay 时,最多 99 个 Unicode 字符,不可包含特殊字符;渠道为 wxwx_pubwx_lite 时,最多 99 个英文和数字的组合或最多 33 个中文字符,不可包含特殊字符;渠道为 alipayjdpay 时,最多 100 个 Unicode 字符;渠道为 allinpay 时,最多 30 个 Unicode 字符;渠道为 balance 时,最多 255 个 Unicode 字符。
metadata optional hash参考元数据
extra conditional hash相关的附加参数,详情参考 extra 参数说明

extra 参数说明

wx、wx_pub、wx_lite 微信企业付款
参数说明
user_name conditional,string收款人姓名。当该参数为空,则不校验收款人姓名。使用企业付款至个人银行卡时,该参数必传。
force_check optional,boolean是否强制校验收款人姓名。仅当 user_name 参数不为空时该参数生效。使用企业付款至个人银行卡时,该参数无效。
card_number optional,string收款人银行卡号。传入该参数时,表示使用企业付款至个人银行卡。不能与 recipient 参数同时传入。
wx_bank_code conditional,string开户银行编号。使用企业付款至个人银行卡时,该参数必传。详情请参考微信企业付款银行编号列表

alipay 支付宝企业付款
参数说明
recipient_name required string1.0 接口时必填,2.0 接口时选填,收款人姓名;3.0 在 recipient_account_type 为 ALIPAY_LOGONID 时, recipient_name 参数必须填写, recipient_account_type 为 ALIPAY_USERID 时, recipient_name 参数为可选填参数
recipient_account_type optional,string3.0 必填;收款方账户类型。可取值: 1、ALIPAY_USERID:支付宝账号对应的支付宝唯一用户号。以 2088 开头的 16 位纯数字组成。 2、ALIPAY_LOGONID(默认值):支付宝登录号,支持邮箱和手机号格式。ALIPAY_LOGONID:支付宝登录号,支持邮箱和手机号格式。
order_title optional,string3.0 可选参数,转账业务的标题,用于在支付宝用户的账单里显示(仅 3.0 支持)

allinpay 通联代付
参数说明
card_number required string1~32位,收款人银行卡号或者存折号。
user_name required string1~100位,收款人姓名。
open_bank_code required string4位,开户银行编号,详情请参考通联代付银行编号说明
business_code optional,string5位,业务代码,根据通联业务人员提供,不填使用通联提供默认值 09900。详情请参考通联代付业务代码说明
card_type optional,string1位,银行卡号类型。0:银行卡、1:存折、2:信用卡。不填默认使用银行卡。
sub_bank conditional,stringB2B 转账必填,1~80位,开户行详细名称,也叫网点,如:中国建设银行广州东山广场分理处。详情请下载 支付行号
sub_bank_code conditional,stringB2B 转账必填,1~12位,支付行号。详情请下载 支付行号
prov conditional,stringB2B 转账必填,1~20位,省份,不带 “省” 或 “自治区”,需填写成:广东、广西、内蒙古等。详情请参考 中国邮政区号表 内的「省洲名称」列的内容填写。
city conditional,stringB2B 转账必填,1~40位,城市,不带 “市”,需填写成:广州、南宁等。如果是直辖市,则填区,如北京(市)朝阳(区)。详情请参考 中国邮政区号表 内的「地区名称」列的内容填写。

unionpay 银联电子代付
参数说明
card_number required string1~32位,收款人银行卡号或者存折号。
user_name required string1~100位,收款人姓名。
open_bank_code optional,string4位,开户银行编号,详情请参考银联电子代付银行编号说明
open_bank optional,string1~50位,开户银行。
prov optional,string1~20位,省份。
city optional,string1~40位,城市。
sub_bank optional,string1~80位,开户支行名称。

open_bank_codeopen_bank 两个参数必传一个,建议使用 open_bank_code ,若都传参则优先使用 open_bank_code 读取规则;provcity 均为可选参数,如果不传参,则使用默认值 "上海" 给渠道接口。


jdpay 京东代付
参数说明
card_number required string1~32位,收款人银行卡号或者存折号。
user_name required string1~100位,收款人姓名。
open_bank_code required string4位,开户银行编号,详情请参考京东代付银行编号说明
card_type optional,string1位,银行卡号类型。0:银行卡、2:信用卡。不填默认使用银行卡。

返回

同步返回付款支付结果。如果发生错误,则会返回错误码和错误详情,详见 错误

定义

POST https://api.pingxx.com/v1/transfers
\Pingpp\Transfer::create();
Transfer.create();
Pingpp::transfers.create()
pingpp.transfers.create();
pingpp.transfers.create();
transfers.New()
create(Dictionary<String, Object> params)

请求示例

curl https://api.pingxx.com/v1/transfers \
-u sk_test_ibbTe5jLGCi5rzfH4OqPW9KC: \
-d order_no=123456789 \
-d app[id]=app_1Gqj58ynP0mHeX1q \
-d channel=wx_pub \
-d amount=100 \
-d currency=cny \
-d type=b2c \
-d recipient=Openid \
-d description="Your Description"
\Pingpp\Pingpp::setApiKey('sk_test_ibbTe5jLGCi5rzfH4OqPW9KC');

\Pingpp\Transfer::create(
    array(
        'order_no'    => '123456789',
        'app'         => array('id' => 'app_1Gqj58ynP0mHeX1q'),
        'channel'     => 'wx_pub',
        'amount'      => 100,
        'currency'    => 'cny',
        'type'        => 'b2c',
        'recipient'   => 'Openid',
        'description' => 'Your Description'
    )
);
Pingpp.apiKey = "sk_test_ibbTe5jLGCi5rzfH4OqPW9KC";

Map<String, Object> transfer = new HashMap<String, Object>();
transfer.put("amount", 100);
transfer.put("currency", "cny");
transfer.put("type",  "b2c");
transfer.put("order_no",  "123456789");
transfer.put("channel",  "wx_pub");
transfer.put("recipient", "Openid");
transfer.put("description", "Your Description");
Map<String, String> app = new HashMap<String, String>();
app.put("id", "app_1Gqj58ynP0mHeX1q");
transfer.put("app", app);
Transfer transfer = Transfer.create(transfer);
require "pingpp"
Pingpp.api_key = "sk_test_ibbTe5jLGCi5rzfH4OqPW9KC"
Pingpp::Transfer.create(
  :amount   => 100,
  :order_no => "123456789",
  :channel  => "wx_pub",
  :currency => "cny",
  :type=> 'b2c',
  :app => {:id => "app_1Gqj58ynP0mHeX1q"},
  :recipient  => "Openid",
  :description => "Your Description"
)
var pingpp = require('pingpp')('sk_test_ibbTe5jLGCi5rzfH4OqPW9KC');
pingpp.transfers.create({
  order_no:    "123456789",
  app:         { id: "app_1Gqj58ynP0mHeX1q" },
  channel:     "wx_pub",
  amount:      100,
  currency:    "cny",
  type:        "b2c",
  recipient:   "Openid",
  description: "Your Description"
}, function(err, transfer) {
  // YOUR CODE
});
tr = pingpp.Transfer.create(
   order_no='123456789',
   channel='wx_pub',
   amount=100,
   type='b2c',
   currency='cny',
   app=dict(id='app_1Gqj58ynP0mHeX1q'),
   recipient='Openid',
   description='Your Description'
)
  params :=&pingpp.TransferParams{
    Order_no:    "123456789",
    App:         pingpp.App{Id: "app_1Gqj58ynP0mHeX1q"},
    Amount:      100,
    Channel:     "wx_pub",
    Currency:    "cny",
    Type:        "b2c",
    Recipient:   "Openid",
    Description: "Your Description",
  }
  transfer, err := transfer.New(params)
Dictionary<String, String> app = new Dictionary<String, String>();
app.Add("id", "app_1Gqj58ynP0mHeX1q");
Dictionary<String, String> extra = new Dictionary<String, String>();
extra.Add("user_name", "user name");
extra.Add("force_check", false);
Dictionary<String, Object> params = new Dictionary<String, Object>();
params.Add("order_no", "1234567890");
params.Add("amount", 100);
params.Add("channel", "wx_pub");
params.Add("currency", "cny");
params.Add("type", "b2c");
params.Add("recipient", "Your OpenId");
params.Add("description", "Your Description");
params.Add("app", app);
params.Add("extra", extra);
  try {
      Transfer tra = Transfer.create(params);
      Console.WriteLine(tra);
   } catch (Exception e) {
      Console.WriteLine(e.Message.ToString());
}

返回示例

{
  "id": "tr_HqbzHCvLOaL4La1ezHfDWTqH",
  "object": "transfer",
  "type": "b2c",
  "created": 1432724825,
  "time_transferred": null,
  "livemode": true,
  "status": "pending",
  "app": "app_1Gqj58ynP0mHeX1q",
  "channel": "wx_pub",
  "order_no": "123456789",
  "amount": 100,
  "amount_settle": 100,
  "currency": "cny",
  "recipient": "o7zpMs5MW2-52GAy5hRrjdYVCktU",
  "description": "Your Description",
  "transaction_no": "1000018301201505200184147302",
  "failure_msg":null,
  "extra": {
      "user_name": "User Name",
      "force_check": true
     }
}