0 评论

0 收藏

分享

[PHP以及PHP框架相关] 百融云策略引擎服务平台策略引擎查询sdk对接步骤-优雅草卓伊凡

首先我们要知道百融云,这也是优雅草的一个商业客户的需求,关于商业具体保密信息不可在此发布,本内容只发布技术文档分享。
这是官方的api接口说明文档
这款产品基本上是核心金融科技产品,是针对金融行业的。
相当细节相当完善
内容太多了,接下来写的demo 就有助于以后大家自行接入并学习参考
SDK介绍
百融云创的策略引擎服务平台是其核心金融科技产品之一,旨在为金融机构提供智能化、自动化的风控决策和业务策略管理工具。该平台通过大数据、人工智能(AI)和机器学习(ML)技术,帮助银行、消费金融、保险等机构优化信贷审批、反欺诈、精准营销等业务流程。以下是其主要特点和功能:

1. 核心功能
  • 风控策略管理:
    • 提供可视化的策略配置界面,支持金融机构自定义风控规则(如评分卡、决策树、规则集等),快速部署信贷审批、反欺诈等场景的决策流程。
    • 支持多维度数据交叉验证,整合百融自身的大数据风控模型(如信用评分、行为画像)及第三方数据(征信、黑名单等)。
  • 实时决策引擎:
    • 支持毫秒级实时风险决策,适用于线上贷款、信用卡申请等高频场景。
    • 可灵活调整策略参数,实现动态风险定价(如差异化利率、额度授信)。
  • 模型与规则协同:
    • 结合机器学习模型(如反欺诈模型、逾期预测模型)与人工规则,提升决策准确性。
    • 支持A/B测试和策略灰度发布,持续优化效果。
  • 场景覆盖:
    • 贷前审核:自动化审批、客户分层。
    • 贷中监控:动态调整额度、触发预警。
    • 贷后管理:催收策略优化、客户流失预测。
    • 精准营销:基于用户画像的客群筛选与触达。


2. 技术优势
  • 低代码/可视化配置:通过拖拽式界面降低技术门槛,业务人员可直接参与策略调整。
  • 高性能计算:支持高并发实时请求,满足互联网级业务需求。
  • 数据整合能力:接入百融自有的亿级数据标签(如消费行为、设备指纹、社交网络等),并支持对接外部数据源。
  • 合规与安全:符合金融数据安全规范(如匿名化处理、隐私计算)。

3. 典型应用案例
  • 消费金融公司:通过策略引擎自动化拒绝高风险用户,将审批通过率提升20%的同时降低逾期率。
  • 银行信用卡中心:动态调整不同客群的授信额度策略,减少人工干预成本。
  • 保险行业:定制化核保规则,识别潜在欺诈风险。

4. 与其他产品的协同
百融的策略引擎通常与其智能风控平台、智能营销平台、AI语音机器人等产品联动,形成端到端的金融科技解决方案。

总结
百融云策略引擎服务平台的核心价值在于帮助金融机构实现风险控制与业务增长的平衡,通过灵活、高效的决策自动化,降低运营成本并提升用户体验。如果需要更详细的技术文档或行业案例,可以参考[百融云创官网]或联系其解决方案团队。
首先我们登陆后台可以看到流程编码
甲方给到的测试key在此
测试账号信息:
apiCode:保密
appKey:保密
测试账户使用须知:
1.测试账户有查询限额和测试期限,如需变更,请联系运营同事处理;
2.请务必留存响应结果中的swift_number(流水号),swift_number是查询的唯一标识,便于排查问题;
3.建议apicode、appkey和策略编号设置成可配置,账号转正上线时可直接替换配置;
4.请提前报备测试环境IP白名单,以免影响接口查询。
登陆服务平台可以看到有demo可以下载,当我下载后看到
<?phpclass Test{    public function AESEncrypt($data, $key)    {        $key = $this->SHA1PRNG($key);        $result = openssl_encrypt($data, "AES-128-ECB",  $key, OPENSSL_RAW_DATA);        return $this->EncodeBase64URLSafeString($result);    }    public function SHA1PRNG($key){        return substr(openssl_digest(openssl_digest($key, "sha1", true), "sha1", true), 0, 16);    }    public function EncodeBase64URLSafeString($result){        return str_replace(['+','/','='], ['-','_',''], base64_encode($result));    }    public function Request(){        $apiCode=xxxxxxx;        $appKey='xxxxxxx';        $appKey_hash = hash("sha256", $appKey);        $data=[            'id'=>hash("sha256", 'xxxxxxx'),            'cell'=>hash("sha256", 'xxxxxxx'),            'name'=>'张',            'strategy_id'=>'STR_BR9999999',        ];        $jsonDataCode = $jsonData=stripslashes(json_encode($data,JSON_UNESCAPED_UNICODE));        $jsonDataAES = $this->AESEncrypt($jsonDataCode, $appKey);        $checkCodeHash = hash("sha256", $jsonDataCode.$apiCode.$appKey);        $post = array(            'apiCode' => $apiCode,            'appKey' => $appKey_hash,            'jsonData' => $jsonDataAES,            'checkCode' => $checkCodeHash,        );        $url = "https://sandbox-api2.100credit.cn/strategy_api/v3/hx_query";        $ch = curl_init();        $httpheader[] = "content-type:application/x-www-form-urlencoded";        curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader);        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);        curl_setopt($ch, CURLOPT_SSLVERSION, 1);        curl_setopt($ch, CURLOPT_URL, $url);        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        curl_setopt($ch, CURLOPT_POST, 1);        curl_setopt($ch, CURLOPT_POSTFIELDS,http_build_query($post));        $result = curl_exec($ch);        if (curl_errno($ch)) {            echo 'Error:' . curl_error($ch);        }        curl_close($ch);        echo '结果:'.$result;    }}    ?>
已经写的比较清晰了,参考文档可以完全理解,根据源代码我们书写如下:
<?phpclass BairongAPI{    private $apiCode = '保密';    private $appKey = '保密';    private $strategyId = 'MCP_BR0001223'; // 信息验证策略编号    private $sandboxUrl = 'https://sandbox-api2.100credit.cn/infoverify/v3/info_verify';    private $productionUrl = 'https://api2.100credit.cn/infoverify/v3/info_verify';    // 加密方法    public function AESEncrypt($data, $key)    {        $key = $this->SHA1PRNG($key);        $result = openssl_encrypt($data, "AES-128-ECB", $key, OPENSSL_RAW_DATA);        return $this->EncodeBase64URLSafeString($result);    }    private function SHA1PRNG($key)    {        return substr(openssl_digest(openssl_digest($key, "sha1", true), "sha1", true), 0, 16);    }    private function EncodeBase64URLSafeString($result)    {        return str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($result));    }    // 执行查询    public function query($name, $idNumber)    {        // 准备请求数据        $data = [            'id' => hash("sha256", $idNumber),            'name' => $name,            'conf_id' => $this->strategyId        ];        $jsonDataCode = stripslashes(json_encode($data, JSON_UNESCAPED_UNICODE));        $jsonDataAES = $this->AESEncrypt($jsonDataCode, $this->appKey);        $appKeyHash = hash("sha256", $this->appKey);        $checkCodeHash = hash("sha256", $jsonDataCode . $this->apiCode . $this->appKey);        $postData = [            'apiCode' => $this->apiCode,            'appKey' => $appKeyHash,            'jsonData' => $jsonDataAES,            'checkCode' => $checkCodeHash,        ];        // 发送请求        $ch = curl_init();        $httpheader = ["content-type:application/x-www-form-urlencoded"];        curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader);        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);        curl_setopt($ch, CURLOPT_SSLVERSION, 1);        curl_setopt($ch, CURLOPT_URL, $this->sandboxUrl); // 测试环境        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        curl_setopt($ch, CURLOPT_POST, 1);        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));        $result = curl_exec($ch);        if (curl_errno($ch)) {            return ['error' => 'CURL Error: ' . curl_error($ch)];        }        curl_close($ch);        return json_decode($result, true);    }    // 格式化显示结果    public function formatResult($result)    {        if (isset($result['error'])) {            return '<div class="alert alert-danger">错误: ' . $result['error'] . '</div>';        }        if (!isset($result['code'])) {            return '<div class="alert alert-warning">无效的响应格式</div>';        }        $output = '<div class="result-container">';        if ($result['code'] === '00' || $result['code'] === '100002') {            $output .= '<div class="alert alert-success">请求成功 (Code: ' . $result['code'] . ')</div>';            if (isset($result['InfoVerification'])) {                $verification = $result['InfoVerification'];                $output .= '<h4>验证结果</h4>';                $output .= '<table class="table table-bordered">';                $output .= '<tr><th>最终决策</th><td>' . ($verification['final_decision'] ?? '无') . '</td></tr>';                $output .= '<tr><th>决策权重</th><td>' . ($verification['final_weight'] ?? '无') . '</td></tr>';                if (isset($verification['hit_rules'])) {                    $output .= '<tr><th colspan="2">命中规则</th></tr>';                    foreach ($verification['hit_rules'] as $ruleSet => $rules) {                        foreach ($rules as $ruleCode => $rule) {                            $output .= '<tr>';                            $output .= '<td>' . ($rule['name_rule'] ?? $ruleCode) . '</td>';                            $output .= '<td>权重: ' . ($rule['weight'] ?? '0') . '</td>';                            $output .= '</tr>';                        }                    }                }                $output .= '</table>';            }            if (isset($result['TelCheck_s'])) {                $telCheck = $result['TelCheck_s'];                $output .= '<h4>手机验证详情</h4>';                $output .= '<table class="table table-bordered">';                $output .= '<tr><th>操作类型</th><td>' . ($telCheck['operation'] ?? '无') . '</td></tr>';                $output .= '<tr><th>验证结果</th><td>' . ($telCheck['result'] ?? '无') . '</td></tr>';                $output .= '<tr><th>处理时间(ms)</th><td>' . ($telCheck['costTime'] ?? '无') . '</td></tr>';                $output .= '</table>';            }        } else {            $output .= '<div class="alert alert-danger">请求失败 (Code: ' . $result['code'] . ')</div>';            // 常见错误处理建议            $errorTips = [                '100003' => '请检查姓名和身份证号是否填写正确',                '100009' => 'IP白名单未添加,请联系管理员',                '100010' => '测试条数已用完,请联系管理员',                '100013' => '策略编号配置错误',                '100014' => '策略产品未开通权限',                '100015' => '校验码错误,请检查加密过程',                '100016' => '请求参数格式错误',            ];            if (isset($errorTips[$result['code']])) {                $output .= '<p>处理建议: ' . $errorTips[$result['code']] . '</p>';            }        }        $output .= '</div>';        return $output;    }}// 处理表单提交if ($_SERVER['REQUEST_METHOD'] === 'POST') {    $bairong = new BairongAPI();    $name = trim($_POST['name'] ?? '');    $idNumber = trim($_POST['id_number'] ?? '');    if (empty($name) || empty($idNumber)) {        $result = ['error' => '姓名和身份证号不能为空'];    } else {        $result = $bairong->query($name, $idNumber);    }}?><!DOCTYPE html><html lang="zh-CN"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>百融云信息验证查询</title>    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">    <style>        body {            padding: 20px;            background-color: #f8f9fa;        }        .container {            max-width: 800px;            background-color: white;            padding: 30px;            border-radius: 8px;            box-shadow: 0 0 10px rgba(0,0,0,0.1);        }        h1 {            color: #0d6efd;            margin-bottom: 30px;            text-align: center;        }        .form-group {            margin-bottom: 20px;        }        .result-container {            margin-top: 30px;        }        .table {            margin-top: 15px;        }    </style></head><body>    <div class="container">        <h1>百融云信息验证查询</h1>        <form method="post">            <div class="form-group">                <label for="name">姓名</label>                <input type="text" class="form-control" id="name" name="name" required>            </div>            <div class="form-group">                <label for="id_number">身份证号</label>                <input type="text" class="form-control" id="id_number" name="id_number" required>            </div>            <button type="submit" class="btn btn-primary">查询</button>        </form>        <?php if (isset($result)): ?>            <?php echo (new BairongAPI())->formatResult($result); ?>        <?php endif; ?>    </div>    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script></body></html>功能说明
  • 完整的PHP类封装:
    • 将百融云API的加密、请求和结果处理封装在BairongAPI类中
    • 包含AES加密、SHA1PRNG密钥生成等必要方法

  • 用户友好的界面:
    • 使用Bootstrap 5构建响应式界面
    • 简洁的表单设计,只需输入姓名和身份证号
    • 美观的结果展示区域

  • 完整的API调用流程:
    • 自动处理参数加密和请求构建
    • 支持沙箱环境测试
    • 正确处理API响应

  • 详细的错误处理:
    • 显示API返回的错误代码
    • 提供常见错误的处理建议
    • 格式化展示验证结果和命中规则

  • 安全考虑:
    • 使用HTTPS协议
    • 敏感信息在传输前进行加密
    • 基本的输入验证


使用说明
  • 将代码保存为index.php文件
  • 上传到支持PHP的Web服务器
  • 确保服务器已开启OpenSSL扩展
  • 访问页面即可使用查询功能

注意事项
  • 当前代码使用测试环境URL,上线前请切换为生产环境URL
  • 确保您的服务器IP已在百融云平台添加到白名单
  • 测试账号有查询条数限制,超出限制会返回错误
  • 正式环境使用时建议添加更多的输入验证和错误处理

您可以根据实际需求进一步调整界面样式或添加更多功能,如查询历史记录、导出结果等。
加了注释的代码如下:
<?php/** * 百融云策略引擎API查询类 * 用于通过百融云API进行用户信息验证查询 */class BairongAPI{    // API账户配置信息    private $apiCode = '保密'; // 由百融云分配的账户标识    private $appKey = '保密'; // 由百融云分配的appKey    private $strategyId = 'MCP_BR0001223'; // 信息验证策略编号    private $sandboxUrl = 'https://sandbox-api2.100credit.cn/infoverify/v3/info_verify'; // 测试环境API地址    private $productionUrl = 'https://api2.100credit.cn/infoverify/v3/info_verify'; // 生产环境API地址    /**     * AES加密方法     * @param string $data 要加密的数据     * @param string $key 加密密钥     * @return string 加密后的Base64URL安全字符串     */    public function AESEncrypt($data, $key)    {        // 使用SHA1PRNG算法生成16字节的密钥        $key = $this->SHA1PRNG($key);        // 使用AES-128-ECB模式加密数据        $result = openssl_encrypt($data, "AES-128-ECB", $key, OPENSSL_RAW_DATA);        // 对加密结果进行Base64URL安全编码        return $this->EncodeBase64URLSafeString($result);    }    /**     * SHA1PRNG密钥生成方法     * 百融云特定的密钥生成算法     * @param string $key 原始密钥     * @return string 生成的16字节密钥     */    private function SHA1PRNG($key)    {        // 两次SHA1哈希后取前16字节        return substr(openssl_digest(openssl_digest($key, "sha1", true), "sha1", true), 0, 16);    }    /**     * Base64URL安全编码     * 将标准Base64转换为URL安全的Base64     * @param string $result 要编码的数据     * @return string URL安全的Base64字符串     */    private function EncodeBase64URLSafeString($result)    {        // 替换特殊字符:+ -> -, / -> _, 去掉=        return str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($result));    }    /**     * 执行API查询     * @param string $name 用户姓名     * @param string $idNumber 用户身份证号     * @return array API返回结果     */    public function query($name, $idNumber)    {        // 准备请求数据数组        $data = [            'id' => hash("sha256", $idNumber), // 身份证号SHA256加密            'name' => $name, // 姓名明文传输            'conf_id' => $this->strategyId // 策略编号        ];        // 将数据转换为JSON字符串并去除斜杠        $jsonDataCode = stripslashes(json_encode($data, JSON_UNESCAPED_UNICODE));        // 对JSON数据进行AES加密        $jsonDataAES = $this->AESEncrypt($jsonDataCode, $this->appKey);        // 对appKey进行SHA256哈希        $appKeyHash = hash("sha256", $this->appKey);        // 生成校验码:jsonData+apiCode+appKey的SHA256哈希        $checkCodeHash = hash("sha256", $jsonDataCode . $this->apiCode . $this->appKey);        // 构建POST请求数据        $postData = [            'apiCode' => $this->apiCode,            'appKey' => $appKeyHash,            'jsonData' => $jsonDataAES,            'checkCode' => $checkCodeHash,        ];        // 初始化cURL会话        $ch = curl_init();        // 设置HTTP头        $httpheader = ["content-type:application/x-www-form-urlencoded"];        curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader);        // 禁用SSL证书验证(测试环境使用,生产环境应启用)        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);        // 设置SSL版本        curl_setopt($ch, CURLOPT_SSLVERSION, 1);        // 设置请求URL(使用测试环境)        curl_setopt($ch, CURLOPT_URL, $this->sandboxUrl);        // 返回结果而不是直接输出        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        // 设置为POST请求        curl_setopt($ch, CURLOPT_POST, 1);        // 设置POST数据        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));        // 执行请求        $result = curl_exec($ch);        // 检查cURL错误        if (curl_errno($ch)) {            return ['error' => 'CURL Error: ' . curl_error($ch)];        }        // 关闭cURL会话        curl_close($ch);        // 将JSON响应解码为数组返回        return json_decode($result, true);    }    /**     * 格式化API返回结果     * @param array $result API返回的结果数组     * @return string 格式化后的HTML结果     */    public function formatResult($result)    {        // 如果有错误直接返回错误信息        if (isset($result['error'])) {            return '<div class="alert alert-danger">错误: ' . $result['error'] . '</div>';        }        // 检查响应是否包含code字段        if (!isset($result['code'])) {            return '<div class="alert alert-warning">无效的响应格式</div>';        }        // 开始构建结果HTML        $output = '<div class="result-container">';        // 判断请求是否成功(code为00或100002表示成功)        if ($result['code'] === '00' || $result['code'] === '100002') {            $output .= '<div class="alert alert-success">请求成功 (Code: ' . $result['code'] . ')</div>';            // 如果有验证结果信息            if (isset($result['InfoVerification'])) {                $verification = $result['InfoVerification'];                $output .= '<h4>验证结果</h4>';                $output .= '<table class="table table-bordered">';                $output .= '<tr><th>最终决策</th><td>' . ($verification['final_decision'] ?? '无') . '</td></tr>';                $output .= '<tr><th>决策权重</th><td>' . ($verification['final_weight'] ?? '无') . '</td></tr>';                // 处理命中规则                if (isset($verification['hit_rules'])) {                    $output .= '<tr><th colspan="2">命中规则</th></tr>';                    foreach ($verification['hit_rules'] as $ruleSet => $rules) {                        foreach ($rules as $ruleCode => $rule) {                            $output .= '<tr>';                            $output .= '<td>' . ($rule['name_rule'] ?? $ruleCode) . '</td>';                            $output .= '<td>权重: ' . ($rule['weight'] ?? '0') . '</td>';                            $output .= '</tr>';                        }                    }                }                $output .= '</table>';            }            // 处理手机验证详情            if (isset($result['TelCheck_s'])) {                $telCheck = $result['TelCheck_s'];                $output .= '<h4>手机验证详情</h4>';                $output .= '<table class="table table-bordered">';                $output .= '<tr><th>操作类型</th><td>' . ($telCheck['operation'] ?? '无') . '</td></tr>';                $output .= '<tr><th>验证结果</th><td>' . ($telCheck['result'] ?? '无') . '</td></tr>';                $output .= '<tr><th>处理时间(ms)</th><td>' . ($telCheck['costTime'] ?? '无') . '</td></tr>';                $output .= '</table>';            }        } else {            // 请求失败的情况            $output .= '<div class="alert alert-danger">请求失败 (Code: ' . $result['code'] . ')</div>';            // 常见错误代码的处理建议            $errorTips = [                '100003' => '请检查姓名和身份证号是否填写正确',                '100009' => 'IP白名单未添加,请联系管理员',                '100010' => '测试条数已用完,请联系管理员',                '100013' => '策略编号配置错误',                '100014' => '策略产品未开通权限',                '100015' => '校验码错误,请检查加密过程',                '100016' => '请求参数格式错误',            ];            // 显示对应的处理建议            if (isset($errorTips[$result['code']])) {                $output .= '<p>处理建议: ' . $errorTips[$result['code']] . '</p>';            }        }        $output .= '</div>';        return $output;    }}// 处理表单提交if ($_SERVER['REQUEST_METHOD'] === 'POST') {    // 创建API实例    $bairong = new BairongAPI();    // 获取表单数据并去除首尾空格    $name = trim($_POST['name'] ?? '');    $idNumber = trim($_POST['id_number'] ?? '');    // 验证输入    if (empty($name) || empty($idNumber)) {        $result = ['error' => '姓名和身份证号不能为空'];    } else {        // 执行查询        $result = $bairong->query($name, $idNumber);    }}?><!DOCTYPE html><html lang="zh-CN"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>百融云信息验证查询·技术支持·优雅草科技</title>    <!-- 引入Bootstrap 5 CSS -->    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">    <style>        /* 页面样式 */        body {            padding: 20px;            background-color: #f8f9fa;        }        .container {            max-width: 800px;            background-color: white;            padding: 30px;            border-radius: 8px;            box-shadow: 0 0 10px rgba(0,0,0,0.1);        }        h1 {            color: #0d6efd;            margin-bottom: 30px;            text-align: center;        }        .form-group {            margin-bottom: 20px;        }        .result-container {            margin-top: 30px;        }        .table {            margin-top: 15px;        }    </style></head><body>    <div class="container">        <h1>百融云信息验证查询·技术支持·优雅草科技</h1>        <!-- 查询表单 -->        <form method="post">            <div class="form-group">                <label for="name">姓名</label>                <input type="text" class="form-control" id="name" name="name" required>            </div>            <div class="form-group">                <label for="id_number">身份证号</label>                <input type="text" class="form-control" id="id_number" name="id_number" required>            </div>            <button type="submit" class="btn btn-primary">查询</button>        </form>        <!-- 结果显示区域 -->        <?php if (isset($result)): ?>            <?php echo (new BairongAPI())->formatResult($result); ?>        <?php endif; ?>    </div>    <!-- 引入Bootstrap 5 JS -->    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script></body></html>
ok 项目完成
因为本项目第一没有收太多钱,第二呢符合学习发展研究方向,所以我们优雅草是必须必须要做的,其次呢甲方同意下面显示优雅草科技名称,钱不多,几千块。

优雅草论坛2022年8月11日大改,优雅草论坛变回只服务于客户的提问交流论坛,详情查看优雅草8月11日大改,原因详情查优雅草外卖乐关闭

回复

举报 使用道具

全部回复
暂无回帖,快来参与回复吧
yac2025
优雅草的临时工
主题 164
回复 0
粉丝 0