
1.背景我们公司有线上的saas服务售卖虚拟服务用户在系统上面进行下单就可以获取到相应的权益。后来公司增加了小程序直播在直播中挂载相关的商品供用户购买也就是微信小店。因为微信小店的订单跟我们系统的订单还没有打通需要人工手动去处理小店里的每笔订单要在我们系统里一笔一笔地去录入效率较低。因此需要实现订单的自动化处理。2.主要流程需要打通微信小店的回调消息推送小店的消息推送类型有很多种商品、订单、支付等很多模块都有消息推送我们这里只处理订单支付成功的回调就行了。2.1 开通支付回调登录微信小店管理系统 小店地址进入服务市场/经验工具我的服务/自研3.初次设置的话需要设置小店密钥按提示设置即可。4.设置报文相关的信息注意只支持80443端口直接填写回调的url如http://10.10.10.410/callback消息加解密方式视频号小店只允许安全模式不可选择使用消息加解密纯密文安全系数高。数据格式视频号小店只允许为JSON不可选择。5. 设置完成后可以按技术文档那样来进行编码接收微信的回调信息文档见技术文档腾讯也提供了相关的工具和demo demo下载主要是在自己的服务里需要提供两个同样路径的回调地址一个支持GET用于校验服务器地址接口一个支持POST请求(携带回调信息)我这里因为使用了密文所以需要进行解密get 类型的回调方法//get请求用于微信小店后台绑定路由验证GetMapping(/callback)LoginIgnorepublicvoidcallback(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException,AesException{StringechoStrrequest.getParameter(echostr);Stringresultnull;try{this.checkRequest(request);resultechoStr;}catch(AesExceptione){log.error(微信小店:回调异常,e);}response.getWriter().print(result);response.getWriter().close();}//校验请求是否微信给过来的privatevoidcheckRequest(HttpServletRequestrequest)throwsAesException{StringmsgSignaturerequest.getParameter(signature);Stringtimestamprequest.getParameter(timestamp);Stringnoncerequest.getParameter(nonce);Stringechostrrequest.getParameter(echostr);echostrechostr.replace( ,);log.info(微信小店收到回调消息 msgSignature{}, timestamp{}, nonce{},echostr{},msgSignature,timestamp,nonce,echostr);WXBizMsgCryptpcnewWXBizMsgCrypt(wechatStoreConfig.getWechatStoreToken(),wechatStoreConfig.getWechatStoreEncodingAesKey(),wechatStoreConfig.getWechatStoreId());pc.verifyUrl(msgSignature,timestamp,nonce,wechatStoreConfig.getWechatStoreToken());}POST方法接收处理回调,如果是配置了接收明文的话就按文档说的返回success就行了密文的话需要返回json内容给微信那边PostMapping(value/callback)LoginIgnorepublicStringcallBack(HttpServletRequestrequest)throwsIOException{StringreturnTemplate{ \Encrypt\: \%s\,\n \MsgSignature\: \%s\,\n \TimeStamp\: %s,\n \Nonce\: \%s\\n};Stringresult;StringtokenwechatStoreConfig.getWechatStoreToken();StringstoreIdwechatStoreConfig.getWechatStoreId();StringwechatStoreEncodingAesKeywechatStoreConfig.getWechatStoreEncodingAesKey();try{StringsMsgSignaturerequest.getParameter(msg_signature);// 时间戳StringsTimestamprequest.getParameter(timestamp);// 随机数StringsNoncerequest.getParameter(nonce);log.info(微信小店收到回调消息 msg_signature{}, timestamp{}, sNonce{},sMsgSignature,sTimestamp,sNonce);InputStreaminputStreamrequest.getInputStream();StringsPostDataIOUtils.toString(inputStream,StandardCharsets.UTF_8);org.json.JSONObjectjsonneworg.json.JSONObject(sPostData);Stringencryptjson.getString(Encrypt);//验证是否微信请求:// 将 token、timestamp、nonce 进行字典序排序StringsignatureSHA1.getSHA1(token,sTimestamp,sNonce,encrypt);if(!sMsgSignature.equals(signature)){thrownewAesException(AesException.ValidateSignatureError);}WXBizMsgCryptwxBizMsgCryptnewWXBizMsgCrypt(token,wechatStoreEncodingAesKey,storeId);StringsMsgwxBizMsgCrypt.decrypt(encrypt);StringencryptedMsgwxBizMsgCrypt.encrypt(WXBizMsgCrypt.getRandomStr(),{\demo_resp\:\good luck\});StringtimeStamp(System.currentTimeMillis()/1000);signatureSHA1.getSHA1(token,timeStamp,sNonce,encryptedMsg);log.info(微信小店,解析后的消息体信息\n{},sMsg);//处理消息resultString.format(returnTemplate,encryptedMsg,signature,timeStamp,sNonce);}catch(Exceptione){log.error(微信小店:回调异常,e);}returnresult;}消息体内容可以参考文档说明回调通知接口说明6. 可以用微信提供的工具进行测试在线调试2. 小店订单与原系统融合在微信小店里的商品管理里可以配置商品的sku我这里配置的是跟我们原系统同样的sku编码有了sku两边的订单就能对齐。主要流程用户完成订单支付时触发回调系统获取到小店的订单信息订单id通过订单详情API接口获取到订单信息包括商品的sku,数量用户手机号等为客户创建系统订单并记录小店与系统订单的关联关系处理进度等。完成订单处理。。。。