PHP

简介

为了提高客户的接入体验,特提供封装的开发SDK,使用本SDK将极大的简化开发者的工作,开发者将无需考虑通信、签名、验签等,只需要关注业务参数的拼装。

下载地址

SDK下载

版本记录

版本 日期 版本说明
v1.0.0 2021/05/06 初始版本
v1.1.0 2021/08/26 实现通用接口请求客户端演示demo,实现部分支付功能的封装

版本要求

PHP 版本 5.6 及以上

接入方法

下载 SDK

下载文件里包含 BsPaySdk 和 BsPayDemo 两个目录。BsPaySdk 目录下为待添加到项目中的文件,BsPayDemo 目录下为示例项目,供接入时参考使用。

SDK 导入

在支付模块中引入 SDK, 参考如下:

<?php
# 以下配置为开发联调时覆盖SDK的配置项,需在引入SDK的init.php之前配置以覆盖SDK初始配置
# 设置是否调试模式,不配置默认关闭:false
define("DEBUG", true);

# 设置调试日志路径,不配置默认为SDK同级的log目录下
define("LOG", dirname(__FILE__)."/log");

# 设置生产模式,不配置默认生产模式:true
define("PROD_MODE", true);

// SDK 初始化文件加载
require_once  dirname(__FILE__). "/../BsPaySdk/init.php";

使用方法

系统初始化

在使用 SDK 调用汇付接口前,请先进行商户配置,否则可能导致交易异常。

正常情况下只有一套商户配置,如有业务需求向汇付申请了多套配置信息,也可配置多个商户配置,并做好商户配置命名管理,配置名必须唯一

调用示例

<?php
/**
 * init方法参数介绍
 * 第一个是配置文件路径或者配置数组对象
 * 第二个参数是是标识第一个参数的类型 true为数组对象 false为文件路径,默认false
 * 第三个是标识配置信息的key,可自定义,保证多套配置不重复即可,默认default,只有一套配置可不传
 **/
BsPay::init(dirname(__FILE__). '/config/config.json', false);

// 追加第二套配置信息
$merConfig = array(
    "product_id" => DemoConstants::DEMO_PRODUCT_ID,
    "sys_id" => DemoConstants::DEMO_SYS_ID,
    "rsa_private_key" => DemoConstants::RSA_PRIVATE_KEY,
    "rsa_public_key" => DemoConstants::RSA_PUBLIC_KEY
);

BsPay::init($merConfig, true, "merchantKey2");

接口调用

接口调用均由 BsPayClient.postRequest 方法发起,上传文件接口由 BsPayClient.postFileRequest 方法发起

<?php
/**
 * 请求接口
 * @param string $funcCode 接口功能编码
 * @param array 请求接口参数集合
 * @param string $merChantKey 商户配置名
 */
public function postRequest($funcCode, $params=array(), $merChantKey = 'default')

/**
 * 文件上传请求接口
 * @param string $funcCode 接口功能编码
 * @param array $params 请求接口参数集合
 * @param \CURLFile $file 待上传的文件
 * @param string $merChantKey 商户配置名
 */
public function postFileRequest($funcCode, $params=array(), $file=null, $merChantKey = 'default')

params 为请求报文体BODY中的 data - 「接口规则-参数规定-报文体」 ,需根据调用接口的API说明组装参数。

funcCode 为请求接口的功能编码,请参考 交易接口功能编码商户管理接口功能编码

file 为文件上传时文件对象。

merchantKey 为上一步初始化时配置的商户配置key。

接口调用实例

以下以聚合反扫接口为例,展示如何使用 SDK 来调用接口。

<?php
namespace BsPayDemo;

use BsPaySdk\BsPayClient;
use BsPayDemo\constants\DemoConstants;

 /**
  * 聚合反扫调用实例
  */

 // 配置商户信息
require_once  dirname(__FILE__). "/config.php";

$nowStr = date("YmdHis");
$nowDate = date("Ymd");
$reqSeqId = $nowStr . "01234567890";
// $merOrdId = $nowStr . "1234567890";
$merOrdId = $reqSeqId;
$timeExpire = date("YmdHis",strtotime(date("YmdHis") . " +2 minutes"));

$trans_params = array(
    // 请求流水号,需保证当天商户下唯一,推荐采用日期时间+几位流水号的形式
    "req_seq_id" => $reqSeqId,
    // 请求日期,请求接口的日期,因服务器时间可能有差异,允许前后1天
    "req_date"=> date("Ymd"),
    // 系统号,由汇付分配
    "sys_id"=>DemoConstants::DEMO_SYS_ID,
    // 商户订单号,需保证商户下唯一,推荐采用日期时间+几位流水号的形式,可与req_seq_id相同
    "mer_ord_id"=>$merOrdId,
    // 分配商户号
    "huifu_id"=>DemoConstants::DEMO_HUIFU_ID,
    // 渠道号,若需使用自有渠道请联系业务对接人
    "bank_channel_no" => "",
    // 交易金额
    "trans_amt"=>"0.02",
    // 商品描述
    "goods_desc"=>"测试商品",
    "auth_code" => "xxxxx",
    // 设备信息
    "terminal_device_info"=>array (
            "device_type"=>"4",
            "device_ip"=>"139.207.19.246"
     ),
    // 风控信息
    // 注意,风控信息为JSON字符串
    "risk_check_info" => json_encode(array(
        "riskMngInfo" => array(
            "subTradeType" => "4300"
        ),
        "ipAddr"=>"139.207.19.246"
    )),
    // 异步通知地址
    "notify_url"=>"virgo://http://www.vclinker.com",

    // 交易有效期
    "time_expire"=>$timeExpire,
    // 指定支付方式 是否禁止用户使用信用卡支付。默认不禁用,若禁止请填1
    "limit_pay"=>"1",
    // 延时标志 1为延迟 0为不延迟
    "is_delay_acct"=>"0",
    // 传入分帐遇到优惠的处理规则 1-按比例分 2-按顺序保障 3-只给交易商户
    "term_div_coupon_type"=>"3",
    // 分账串
    // 注意只有真实分账场景才需要传入分账串,请避免传入多个分账方为同一商户的分账串
    "acct_split_bunch"=>array(
        "acct_infos" => array(
            // 分账方1
            array(
                "huifu_id"=>DemoConstants::DEMO_HUIFU_ID,
                "div_amt"=>"0.01"
            ),
            // 分账方2
            array(
                "huifu_id"=>DemoConstants::DIV_HUIFU_ID,
                "div_amt"=>"0.01"
            )
        )
    ),
    // 商户私有域
    "mer_priv"=>"",
    // 微信扩展参数集合
    "wx_data"=>"",
    // 支付宝扩展参数集合
    "alipay_data"=>"",
    // 银联扩展参数集合
    "unionpay_data"=>"",
    // 手续费类型 01:标准费率线上,02:标准费率线下,03:非盈利费率,04:缴费费率,05:保险费率,06:行业活动费率,07:校园餐饮费率,08:K12中小幼费率
    // 不送时取业务入驻配置的默认费率
    "pay_scene"=>"02",
);

$trans = new BsPayClient();

# 请求聚合反扫接口
$trans->postRequest("top.trans.authCodePay", $trans_params);
# 如有多套配置,可指定使用哪套配置,指定merchanKey为初始化时设置的。
#$trans->postRequest("top.trans.authCodePay", $trans_params, "merchantKey2");

if ($trans->isError()){
    //失败处理
    var_dump($trans->result);
} else {
    //成功处理
    var_dump($trans->result);
}

 $query_params = array(
     "huifu_id"=> DemoConstants::DEMO_HUIFU_ID,
     "req_date"=> $nowDate,
     "sys_id"=> DemoConstants::DEMO_SYS_ID,
     "req_seq_id"=> $reqSeqId
 );


 # 请求交易查询接口
 $trans->postRequest("topqur.transQuery", $query_params);
 # 如有多套配置,可指定使用哪套配置,指定merchanKey为初始化时设置的。
 #$trans->postRequest("topqur.transQuery", $query_params, "merchantKey2");
 # 对进件结果进行处理
 if ($trans->isError()){
     //失败处理
     var_dump($trans->result);
 } else {
     //成功处理
     var_dump($trans->result);
 }
 ?>