标题:支付宝 alipay.riskgo.risk.push 风险推送接口GBK编码处理办法
 来源:Admin 位置:博客->技术支持 时间:2022-05-12  热度:888℃

使用场景:

为支付宝合作伙伴提供实时业务风险交易推送功能,涵盖欺诈、赌博、用户投诉等多种业务风险类型,协助合作伙伴及时处理风险交易。

实际案例:

某商业银行从事移动支付业务后不久,欺诈团队伪装成为商户进行诈骗,并不停切换商户账户,产生大量用户投诉后,监管部门介入要求整改,业务受到影响开始下跌。接入RiskGo交易安全防护产品,并收到推送的风险信息后,及时将风险较高的商户进行清退和检查,整体风险大幅下降90%,业务开始快速上升。


已知官方推送消息的编码为 GBK

为什么需要验签:确认合法性,或者不验签也可以,此消息推送只会发送一次,无重复推送机制。

已PHP演示为例子:(不要进行urldecode()处理字符串)

 

$params = [];
parse_str(file_get_contents("php://input"),$params); //无需urldecode处理,某文章误导结果掉大坑里去了
$ToBeSignedStr = getSignContent($params,'GBK'); //得到待签名字符串,往下走正常的RSA验签即可 
.............

        /**
         * 构建待签名字符串
         * @param array $params
         * $return string
         **/
        public function getSignContent($params,$charset) {
            ksort($params);
            $stringToBeSigned = "";
            $i = 0;
            foreach ($params as $k => $v) {
                if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) {
                    // 转换成目标字符集 ps:获取可以省略?未测试
                    $v = $this->characet($v, $charset);
                    if ($i == 0) {
                        $stringToBeSigned .= "$k" . "=" . "$v";
                    } else {
                        $stringToBeSigned .= "&" . "$k" . "=" . "$v";
                    }
                    $i++;
                }
            }
            unset ($k, $v);
            return $stringToBeSigned;
        }
    
        /**
         * 转换字符集编码
         * @param $data 原始字符串
         * @param $targetCharset 要转换的编码
         * @param $fileType 原始编码
         * @return string
         */
        public function characet($data, $charset,$fileType='GBK') {
            if (!empty($data)) {
                $data = mb_convert_encoding($data, $charset, $fileType);
            }
            return $data;
        }
        
         /**
         * 校验$value是否非空
         *  if not set ,return true;
         *  if is null , return true;
         **/
        public function checkEmpty($value) {
            if (!isset($value))
                return true;
            if ($value === null)
                return true;
            if (trim($value) === "")
                return true;
            return false;
        }