zoukankan      html  css  js  c++  java
  • 微信第三方平台授权测试代码:

    @Controller

    @CrossOrigin(origins = Array("*"), maxAge = 3600, allowedHeaders = Array("Content-Type"), allowCredentials = "false")

    class PlatformController { 

      @Autowired

      @BeanProperty var wxCacheManage: WxCacheManage = _

      val logger = LoggerFactory.getLogger(classOf[PlatformController])

      

      @RequestMapping(value = Array(Url.WxPlatForm.SERVICE_CALL_BACK), method = Array(RequestMethod.GET))

      @ResponseBody

      def getMPAuthCode(@PathVariable storeId: Int, req: HttpServletRequest): String =  {

        val url = req.getHeader("Host")

        val ComAppId = zefunService.appId

        {

          for {

            authCode <- Option(req.getParameter("auth_code"))

            ticket <- wxCacheManage.getPlatformTicket(ComAppId)

          } yield (authCode, ticket)

        }.flatMap{

          case ((authCode, ticket)) =>

            logger.info(s"获取公众号授权码:$authCode")

            val q = for {

              token <- wxCacheManage.getCacheComponentAccessToken(ComAppId, ticket)

              auth <- getAuthorizerInfo(token, ComAppId, authCode).toOption

              authInfo <- getAuthorizerAccountInfo(token, ComAppId, auth.authorization_info.authorizer_appid).toOption

            } yield (auth, authInfo)

            q.map{ case (auth, authInfo) =>

              logger.info("授权账号信息:" + auth.authorization_info.authorizer_appid)

             // Redirect(s"http://$url/home/brand/$id/weixin/platform")

             "success"

            }

        }.getOrElse {

          logger.info("公众号授权传入参数错误或缓存票据已经失效...")

          "success"

        }

      }

      /**

        * 获取第三方平台ticket, 微信统一要求返回字符串

     *

        * @return

        */

      @RequestMapping(value = Array(Url.WxPlatForm.PLATFORM_MAIL_BOX), method = Array(RequestMethod.POST))

      @ResponseBody

      def platFormMailBox(@RequestBody xml: String, req: HttpServletRequest): String =  {

        {

          for {

            msgSignature <- Option(req.getParameter("msg_signature"))

            nonce <- Option(req.getParameter("nonce"))

            timestamp <- Option(req.getParameter("timestamp"))

            signature <- Option(req.getParameter("signature"))

          } yield (msgSignature, nonce, timestamp, signature)

        }.map {

          case ((msgSignature, nonce, timestamp, signature))

            if verifySignature(timestamp, nonce, signature, zefunService.token) =>

            logger.info("信息"+xml)

            val recXml = XML.loadString(getDecryptContent(zefunService, VerifyTicket(msgSignature, timestamp, nonce, xml)))

            logger.info(s"推送消息解密内容:$recXml")

            recXml.\("InfoType").text match {

              case infoType if infoType == "component_verify_ticket" =>

                val ticket = recXml.\("ComponentVerifyTicket").text

                wxCacheManage.setPlatformTicket(zefunService.appId, ticket)

                wxCacheManage.getCacheComponentAccessToken(zefunService.appId, ticket)

                logger.info(s"缓存微信推送票据:$ticket")

                "success"

              case unauth if unauth == "unauthorized" =>

                val authAppId = recXml.\("AuthorizerAppid").text

                "success"

              case _ => "failure"

            }

        }.getOrElse {

          logger.info("获取微信推送票据参数失败")

          "success"

        }

      }

      /**

        * 界面点击进入授权页面

        * @return

        */

      @RequestMapping(value = Array(Url.WxPlatForm.AUTH_ADDRESS), method = Array(RequestMethod.GET))

      @ResponseBody

      def getAuthAddress(@PathVariable storeId: Int, req: HttpServletRequest): String = {

        val url = req.getHeader("Host")

        val comAppId = zefunService.appId

        val preAuthCode = for {

          ticket <- wxCacheManage.getPlatformTicket(comAppId)

          token <- wxCacheManage.getCacheComponentAccessToken(comAppId, ticket)

          pre <- getPreauthcode(token, comAppId).toOption

        } yield pre.pre_auth_code

        preAuthCode.map { code =>

          s"https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=$comAppId&pre_auth_code=$code&redirect_uri=" +

            s"http://$url/marketing/wechat/platform/auth/servecallback/store/$storeId"

        }.getOrElse("")

      }

      import MsgTypeCons._

      import EventCons._

      /**

        * 微信第三方平台处理中心

     *

        * @param appId

        * @param xml

        * @param req

        * @return

        */

      @RequestMapping(value = Array(Url.WxPlatForm.PLATFORM_CENTER), method = Array(RequestMethod.POST),

        produces = Array(MediaType.APPLICATION_XML_VALUE, MediaType.TEXT_XML_VALUE))

      @XmlRootElement

      @ResponseBody

      def platFormCenter(@PathVariable appId: String, @RequestBody xml: String, req: HttpServletRequest): String =  {

        val msgSignature = req.getParameter("msg_signature")

        val nonce = req.getParameter("nonce")

        val timestamp = req.getParameter("timestamp")

        val recXml = XML.loadString(getDecryptContent(zefunService, VerifyTicket(msgSignature, timestamp, nonce, xml)))

        logger.info(s"推送xml:${recXml}")

        val toUserName = recXml.\("ToUserName").text

        val fromUserName = recXml.\("FromUserName").text

        recXml.\("MsgType").text match {

          case text if text == XML_MSG_TEXT =>

            val content = recXml.\("Content").text

            // 以下为微信全网发布测试代码:

            if (content == "TESTCOMPONENT_MSG_TYPE_TEXT") {

              val reply = OutTextMsg(fromUserName, toUserName, content + "_callback")

              getEncryptContent(zefunService, reply.toXml, reply.createTime.toString, nonce)

            }

            else {

              val comAppId =  zefunService.appId

              val query_code = content.split(":").last

              val msg = content.split(":").head

              if (content.startsWith("QUERY_AUTH_CODE")) {

                val ticket = wxCacheManage.getPlatformTicket(comAppId).getOrElse("")

                // val ticket = "ticket@@@G0azzaT2F5lvF2H2jcmMU8W7UEEOGNamM_2IIlnIALBtHOFiuTgS1Bzq-M74hFuaUTCP0IyL1B0pVnrBVCuxGw"

                logger.info("客服票据:" + ticket)

                getPlatFormAccessToken(comAppId, zefunService.secret, ticket.trim).map{ acc =>

                  logger.info("第三平台token" + acc.component_access_token)

                  getAuthorizerInfo(acc.component_access_token, comAppId, query_code).flatMap { auth =>

                    sendServiceMsg(fromUserName, query_code + "_from_api", auth.authorization_info.authorizer_access_token)

                  }

                }

               ""

              } else {

                // 关键字消息回复:

                val reply = OutTextMsg(fromUserName, toUserName, "hello")

                getEncryptContent(zefunService, reply.toXml, reply.createTime.toString, nonce)

              }

            }

          case event if event == XML_MSG_EVENT =>

            println("开发者微信号:"+ toUserName +"----"+"用户信息"+ fromUserName)

            val msg = recXml.\("Event").text

            val reply = OutTextMsg(fromUserName, toUserName, msg + "from_callback")

            getEncryptContent(zefunService, reply.toXml, reply.createTime.toString, nonce)

          case _ => ""

        }

      }

      /**

        * 发起授权页的体验验证方法

     *

        * @return

        */

      @RequestMapping(value = Array(Url.WxPlatForm.VERIFY_AUTH), method = Array(RequestMethod.GET))

      @ResponseBody

      def verifyAuth: String = "success"

    }

  • 相关阅读:
    Helpers Overview
    Validation
    Support Facades
    Session Store
    位运算(参考百科)
    开源项目_可能使用到的开源项目集合
    秒杀系统架构分析与实战(转)
    shell命令之根据字符串查询文件对应行记录
    MySQL做为手动开启事务用法
    spring 加载bean过程源码简易解剖(转载)
  • 原文地址:https://www.cnblogs.com/monion/p/6077208.html
Copyright © 2011-2022 走看看