点击官方服务,可以看到当前已经关联的官方场景,如果之前没有关联过,则需要点击关联官方场景
点击关联官方场景,如下图所示
说明:
这一步主要配置三方实现这个接口对外网可以访问的HTTP URL。奇门会请求这个URL,然后获取到结果。如下图所示
需要注意的点:
这里主要是说明三方对于返回结果的json格式需要是什么样的结构。这里举例alibaba.wdk.payment.pay接口为例,要求的返回结构和实际返回的数据如下图所示
用奇门提供的工具来测试自己的代码,以及返回是否是接口要求的格式,使用这个工具可以解耦开需要跟盒马的开发同学一起联调的问题。如下图所示
需要注意的点:
测试完成之后就可以正式对外发布了。发布过程中还需要进行一些签名配置,具体的可以参考奇门官方的文档,点击这里访问。参考API服务签名验证部分。
在正式发布之后需要授权盒马的appkey,允许盒马的appkey来调用你的服务。盒马的appkey是:23773503。操作步骤如下图所示。
如果实现的奇门接口在这里正式环境和测试环境都有了,那么就代表授权成功。否则在实际调用中会出现无法找到路由的错误。
在写代码的时候一定要使用开放平台的sdk来开发,否则其中的签名,请求的方式等各种问题会搞的很花时间。举例如下:
import com.alibaba.fastjson.JSONObject; import com.qimencloud.api.sceneqimen.request.*; import com.qimencloud.api.sceneqimen.response.*; import com.taobao.api.internal.spi.CheckResult; import com.taobao.api.internal.spi.SpiUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; @RequestMapping(value = "/payment_ack", method = {RequestMethod.GET,RequestMethod.POST}) @ResponseBody public AlibabaWdkPaymentAckResponse paymentAck(HttpServletRequest request){ try{ CheckResult checkResult = SpiUtils.checkSign(request, appSecret); if (!checkResult.isSuccess()){ AlibabaWdkPaymentAckResponse errResponse = new AlibabaWdkPaymentAckResponse(); /** * 注意:这里设置的错误信息和错误code,一定要按照奇门接口配置的时候说明的错误返回内容严格设置 * 否则在安全性校验上会不通过。 */ errResponse.setErrorMessage("Illegal request"); errResponse.setErrorCode("sign-check-failure"); errResponse.setSuccess(false); return errResponse; }else{ JSONObject jsonObject = JSONObject.parseObject(checkResult.getRequestBody()); AlibabaWdkPaymentAckRequest.AckParamDO paramDO = jsonObject.getJSONObject("ackParamDO").toJavaObject(AlibabaWdkPaymentAckRequest.AckParamDO.class); //TODO 实现自己的业务逻辑,然后返回 return doPaymentAck(paramDO); } }catch (Exception e){ log.error(e.getMessage(),e); AlibabaWdkPaymentAckResponse errResponse = new AlibabaWdkPaymentAckResponse(); errResponse.setSuccess(false); errResponse.setErrorCode(String.valueOf(ErrorCode.PAYMENT_ACK_SYS_ERROR.getCode())); errResponse.setErrorMessage(e.getMessage()); return errResponse; } }
对于示例中的错误设置,参考接口实现配置中接口文档预览中的说明,如下图所示