• 微信第三方平台授权测试代码:


    @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"

    }

  • 相关阅读:
    R语言:提取路径中的文件名字符串(basename函数)
    课程一(Neural Networks and Deep Learning),第三周(Shallow neural networks)—— 0、学习目标
    numpy.squeeze()的用法
    课程一(Neural Networks and Deep Learning),第二周(Basics of Neural Network programming)—— 4、Logistic Regression with a Neural Network mindset
    Python numpy 中 keepdims 的含义
    课程一(Neural Networks and Deep Learning),第二周(Basics of Neural Network programming)—— 3、Python Basics with numpy (optional)
    课程一(Neural Networks and Deep Learning),第二周(Basics of Neural Network programming)—— 2、编程作业常见问题与答案(Programming Assignment FAQ)
    课程一(Neural Networks and Deep Learning),第二周(Basics of Neural Network programming)—— 0、学习目标
    课程一(Neural Networks and Deep Learning),第一周(Introduction to Deep Learning)—— 0、学习目标
    windows系统numpy的下载与安装教程
  • 原文地址:https://www.cnblogs.com/monion/p/6077208.html
Copyright © 2020-2023  润新知