芝麻信用管理有限公司 芝麻芝麻信用页面信用页面授权授权说明说明 版本号:1.0 芝麻信用管理有限公司 1. 功能功能 页面授权用于在需要用户感知的情况下由商户系统引导用户跳转到芝麻的 授权页面完成基于短信验证码的授权流程, 在授权成功以后返回该用户在商户端 的 openId,便于商户系统查询该用户需要授权的信用产品比如 99 分期,58 同 城等外部核身能力较弱的商户等 2. 请求请求 URL 上述条件均满足,则会跳转到如下界面: 芝麻信用管理有限公司 异常场景异常场景 1:如果用户未开通支付宝,或已开通但未绑定号:如果用户未开通支付宝,或已开通但未绑定号则会展示如下则会展示如下 错误:错误: 异常场景异常场景 2:输入校验码错误,则会显示如下错误::输入校验码错误,则会显示如下错误: 异常场景异常场景 3:如果输错校验码连续超过:如果输错校验码连续超过 3 次,次,则会显示如下错误:则会显示如下错误: 芝麻信用管理有限公司 3) 用户给商户授权,需要通过短信进行核身点击“发送校验码” :用户给商户授权,需要通过短信进行核身点击“发送校验码” : 4) 用户用户支付宝账号绑定的支付宝账号绑定的会收到会收到 6 位校验码。
位校验码 5) 用户在输入框内输入用户在输入框内输入 6 位校验码,并提交验证如果失败超过位校验码,并提交验证如果失败超过 3 次,请点击次,请点击 “重发校验码” 重发校验码” 6) 授权成功,授权成功,3 秒钟后会自动跳转到商户回调地址,或手动点击“返回”按钮秒钟后会自动跳转到商户回调地址,或手动点击“返回”按钮 跳回商户端跳回商户端 芝麻信用管理有限公司 支付宝服务窗场景:在请求参数中的支付宝服务窗场景:在请求参数中的 pageType=windows 的情况下,说明是从支的情况下,说明是从支 付宝钱包服务窗过来的授权请求,会省略付宝钱包服务窗过来的授权请求,会省略第第 2,3,4,5 步步流程流程,直接到,直接到第第 6 步的步的授授 权成功页面权成功页面 5. 授权授权回调回调 callbackUrl?state=*** ZmOpenApiAuthEngineRequest authEngineRequest = new 芝麻信用管理有限公司 ZmOpenApiAuthEngineRequest(); authEngineRequest.setAppId(“1000033“); authEngineRequest.setAuthType(“0“); Map authParams = new HashMap(); authParams.put(“certNo“, “333333199001011234“); authParams.put(“name“, “张三“); authEngineRequest.setAuthParam(authParams); authEngineRequest.setMerchantId(“268820000049436291974“); authEngineRequest.setView(“redirect“);//进行页面跳转. authEngineRequest.setPageType(“pc“);//跳转到zmopenapi的pc页面中. authEngineRequest.setSences(“58月付“); authEngineRequest.setState(“testState“); ZmOpenApiClient zmOpenApiClient = new DefaultZmOpenApiClient(ZM_PUBLIC_KEY, PRIVATE_KEY); System.out.println(zmOpenApiClient.buildAuthUrl(authEngineRequest, authEngineUrl)); 3)解密回调业务数据 String callbackUrl = “ ?state=11223344 int index = callbackUrl.indexOf(“?“); String[] paramPairs = callbackUrl.substring(index + 1).split(“ Map params = new HashMap(); for (String paramPair : paramPairs) { String[] tmps = paramPair.split(“=“); params.put(tmps[0], tmps[1]); } String state = params.get(“state“); String paramValue = URLDecoder.decode(params.get(“params“), CHARSET); String sign = URLDecoder.decode(params.get(“sign“), CHARSET); String errorCode = params.get(“errorCode“); String result = params.get(“result“); if (result != null String responseResult = new String(RSACoderUtil.decryptByPrivateKey(byte64, PRIVATE_KEY), CHARSET);//用应用的私钥解密. System.out.println(responseResult); //正常的业务处理,把openId落库到数据库中,引导用户继续往下处理,说芝麻信用管理有限公司 明授权成功 } else { //处理错误 } } 8. PHP 样例代码样例代码 目前芝麻信用不提供 PHP 的 sdk,需要商户技术开发人员自己包装请求参数,加 密,解密,加签,验签。
下面提供了加密的样例代码供参考 1) 加密业务参数 //data:业务参数的明文,key:芝麻公钥 public function encrypt($data,$pubKey){ $maxlength=117; $output=''; while($data){ $input= substr($data,0,$maxlength); $data=substr($data,$maxlength); openssl_public_encrypt($input,$encrypted,$pubKey); $output.= $encrypted; } return base64_encode($output); } 2) 解密回调业务数据 //data:需要解密的数据,key:商户的私钥 public function decrypted($data,$priKey){ $data = base64_decode($data); $maxlength=128; $output=''; while($data){ $input = substr($data,0,$maxlength); $data = substr($data,$maxlength); openssl_private_decrypt($input,$out,$priKey); $output.=$out; } return $output; } 芝麻信用管理有限公司 3) 加签业务参数 //data:需要加签的数据,priKey:商户的私钥 protected function sign($data, $priKey) { $data = sha1($data); //转换为 openssl 格式密钥 $res = openssl_get_privatekey($priKey); //调用 openssl 内置方法加签,给变量 sign 赋值 openssl_sign($data, $sign, $res, OPENSSL_ALGO_MD5); //释放资源 openssl_free_key($res); //把加签后的 byte 数组转化为 base64 字符串 $sign = base64_encode($sign); //返回签名后的值 return $sign; } 4) 验签芝麻返回的加签后的数据 //data: 需要验签的数据 //sign: 芝麻私钥签名后的数据 //pubKey: 芝麻公钥 function verify($data, $sign, $pubKey) { $data = sha1($data); //转换为 openssl 格式密钥 $res = openssl_get_publickey($pubKey); //调用 openssl 内置方法验签,返回 bool 值 $result = (bool)openssl_verify($data, base64_decode($sign), $res, OPENSSL_ALGO_MD5); //释放资源 openssl_free_key($res); //返回验签结果 return $result; } 9. .net 样例代码样例代码 参考和文档一起发出的类 RsaUtil.cs 。