接收第三方回调,请求方式小技巧

     对接第三方接口的时候你会发现,会有回调地址这么一说。一般情况下在请求第三方接口创建订单或者是执行某项操作的时候使得你的订单状态发生改变,第三方会调用你的回调地址将相关的状态变更推送给你,这种第三方主动通过地址请求你的方式,就叫做第三方回调。

   1. 第三方回调参数不准确怎么办?

    一般情况下不会碰到,但是如果碰到多个业务耦合,并且回调地址只有一个的时候。比如,滴滴打车和全平台打车(整合多家打车业务)在一家第三方这里只有一个回调地址,然而你调用不同的接口回调的参数是不同的,估计大家脑海中已经有了一个想法---request请求域。但是这个时候你要做一下改动,不然拿值是不好拿的。

 @RequestMapping(value = "/callBack")
    public BaseResponse callBackForDD( String no, String out_source_no, String state) {
       // request
        // 参数Map
        Map properties = request.getParameterMap();
        // 返回值Map
        Map returnMap = new HashMap();
        Iterator entries = properties.entrySet().iterator();
        Map.Entry entry;
        String name = "";
        String value = "";
        while (entries.hasNext()) {
            entry = (Map.Entry) entries.next();
            name = (String) entry.getKey();
            Object valueObj = entry.getValue();
            if(null == valueObj){
                value = "";
            }else if(valueObj instanceof String[]){
                String[] values = (String[])valueObj;
                for(int i=0;i<values.length;i++){
                    value = values[i] + ",";
                }
                value = value.substring(0, value.length()-1);
            }else{
                value = valueObj.toString();
            }
            log.info("回调参数:"+name+":"+ value);
            returnMap.put(name,value);
        }

        log.info(request.getParameterMap().toString());
        log.info("订单ID:" + no + "服务商单号:" + out_source_no
                + ",状态:" + state);
        return rhAllTaxiService.getCallBackForDD(no, out_source_no, state,returnMap);
    }

在这个地方,有三个参数和一个map,在我这里只是一个半成品,前期只是对接了一个业务,后期发现还要对接第二个,但是现在这个接口已经满足不了需求,干脆用request接收到相应的所有参数,这样以后再追加新的业务和功能就不用进行大的改动了。这边里面的map可以说是一个工具类吧,有兴趣的小伙伴可以保存下来,具体功能就在于将request请求域里面的值遍历循环到一个map数组中去,然后根据你相应的需求去拿到相应的值做操作即可。

     2.put请求怎么使用formdata参数?

    很难受,如果在springboot中单纯的在put请求上添加formdata格式的参数,注定你是拿不到传过来的值,是需要后台进行配置一下的。

@Bean
    public HttpPutFormContentFilter httpPutFormContentFilter() {
        return new HttpPutFormContentFilter();
    }
@EnableWebMvc
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

如果你这边是springboot项目的话,是需要新建一个类继承WebMvcConfigurerAdapter 类的,通过HiddenHttpMethodFilter获取put表单中的参数-值,HttpPutFormContentFilter过滤器的作为就是获取put表单的值,并将之传递到Controller中标注了method为RequestMethod.put的方法中。

如果你这边是其他spring类型的项目,可以在配置文件web.xml中进行配置

<filter>
		<filter-name>httpPutFormcontentFilter</filter-name>
		<filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>httpPutFormContentFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

这一点需要小伙伴们注意一下,楼主在这里踩过坑。。。

3.小经验之谈

 3.1.对接第三方接口,不管怎么对接,都要考虑到你的上游客户使用时的便捷性,在编写代码的过程中,swagger页面上的接口参数命名一定要规范,暴露出来的参数一定是要有意义的,如果暴露的参数在后台也是可以取到值的情况,那就尽量不要暴露给客户。合适的代码不仅要方便自己,还要方便其他使用你的代码的人。

 3.2.如果你的业务中,既要对接第三方,又要链接本地数据库进行操作,so,做好sql语句的优化,对于城市,影院,车型等固定的信息尽量缓存。

 3.3.通常第三方接口都会涉及下单,这个时候你需要建立一张数据库表,保存一切能保存的信息,不要怕麻烦,因为到了真正上线的时候,如果扣款失败等等情况,在这里面都是可以拿到相应的有用信息的。 

 3.4.多打日志,对于我这样的新手来说,总是会忘记打日志,事实告诉我,不打日志你会吃很大的亏,至少各种请求的入参,出参 ,已经关键地方的参数需要打出来,这样便于你快速定义相关错误,经验哟....-_-

 3.5.一定要,一定要耐得住烦,很有可能你的需求会接二连三的改动。

 3.6.尽量在公共部分做封装,如果一个第三方设计20个接口,如果你把HttpClient写20遍是不是太难受了,尽量做好封装造好轮子,便于自己更加快速的开发。

### 小程序集成第三方支付的功能和方法 #### 接入流程概述 为了在微信小程序中成功集成第三方支付功能,开发者需遵循一系列标准化的接入流程。这些流程涵盖了准备工作、接口调用以及后续的结果处理等多个方面[^1]。 #### 微信支付的基础实现 以下是基于微信支付的小程序支付功能的具体实现步骤: 1. **获取商户号与密钥** 商户需要先注册成为微信支付的服务商并获得相应的商户号(MCH_ID),同时还需要设置用于签名验证的API密钥。 2. **统一下单接口请求** 开发者可以通过发起统一订单接口来生成预支付交易会话标识`prepay_id`。此过程涉及多个必要字段的传递,例如商品描述(`body`)、总金额(`total_fee`)、随机字符串(`nonce_str`)等。 ```json { "appid": "wx8888888888888888", "mch_id": "1900000109", "device_info": "WEB", "nonce_str": "5K8264ILTKCH16CQ2502SI8ZNMTM67VS", "sign": "C380BEC2BFD727A4BEBF6E62D84D89AD", "body": "腾讯充值中心-QQ会员充值", "out_trade_no": "20150806125346", "fee_type": "CNY", "total_fee": 1, "spbill_create_ip": "127.0.0.1", "notify_url": "http://www.example.com/wxpay.php", "trade_type": "JSAPI" } ``` 3. **前端页面加载支付参数** 完成服务器端下单操作后,客户端应接收来自服务端返回的数据,并将其封装至前端所需的支付参数对象内。随后利用`wx.requestPayment()`函数触发实际支付行为。 ```javascript wx.requestPayment({ 'timeStamp': '', 'nonceStr': '', 'package': '', 'signType': 'MD5', 'paySign': '', success(res) { }, fail(res) { } }); ``` #### 处理支付结果与异步通知 当用户完成支付动作之后,系统将会向预先设定的通知地址发送回调消息。此时需要注意的是,由于网络延迟等原因可能导致前后端状态不一致的情况发生,因此建议采用轮询机制定期查询最终支付结果以确保准确性[^2]。 #### 实战技巧总结 针对可能出现的各种异常情况,这里列举了一些常见问题及其解决方案: - 如果发现无法正常唤起微信客户端,则可能是路径或者Manifest文件内的Intent Filter配置存在问题; - 当前环境未处于已登录状态下仍可尝试打开授权页引导用户进入后再继续执行原业务逻辑; - 预付ID格式不符合预期时,请仔细核对各组成部分是否正确无误; - 关于签名算法的选择务必严格按照官方文档指导进行实施,切勿随意更改大小写形式; - 调试阶段不可依赖Debug版本APK包运行测试代码,因为正式环境下所使用的证书签名校验规则与此不同[^4]。 #### 扩展阅读:其他主流第三方支付方案简介 除了上述提到的微信支付之外,在实际项目开发过程中还经常需要用到诸如支付宝这样的另一款广泛支持移动互联网场景下的在线付款工具。两者虽然具体细节有所差异但总体思路基本相同——均围绕着创建订单->提交审核->等待确认这几个核心环节展开讨论[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值