Consulta de Endereço IP em Mini Program do WeChat

Exemplo de implementação de uma página de consulta de andereço IP em um Minni Program do WeChat. A interface contém uma barra de pesquisa, validação do formato IPv4 e a exibição dos dados reotrnados por uma API externa.

search.wxml

<view class="container">
  <view class="page-body">
    <view class="weui-search-bar {{classeFoco}}">
      <view class="weui-search-bar__form">
        <view class="weui-search-bar__box">
          <icon class="weui-icon-search" />
          <input type="text" class="weui-search-bar__input" placeholder="Digite um IP" confirm-type="search"
            value="{{textoBusca}}" focus="{{foco}}"
            bindinput="aoDigitar" bindconfirm="confirmarBusca" />
          <a href="javascript:" class="weui-icon-clear" bindtap="limparBusca"></a>
        </view>
        <view class="weui-search-bar__label" bindtap="ativarBusca">
          <icon class="weui-icon-search" />
          <view class="weui-search-bar__label_span">Pesquisar (8.8.8.8)</view>
        </view>
      </view>
      <view class="weui-search-bar__cancel-btn" bindtap="cancelarBusca">Cancelar</view>
    </view>
  </view>

  <view class="page-section">
    <view class="page-section-title">
      <text>Resultado da consulta</text>
    </view>
    <view class="page-section-spacing">
      <scroll-view scroll-y="true" class="painel-scroll">
        <view class="item-scroll">
          <view class="valor-ip">{{info.ip}}</view>
        </view>

        <view class="weui-cell">
          <view class="weui-cell__bd"><text>{{info.continent}}</text></view>
          <view class="weui-cell__ft">Continente</view>
        </view>
        <view class="weui-cell">
          <view class="weui-cell__bd"><text>{{info.country}}</text></view>
          <view class="weui-cell__ft">País</view>
        </view>
        <view class="weui-cell">
          <view class="weui-cell__bd"><text>{{info.province}}</text></view>
          <view class="weui-cell__ft">Província</view>
        </view>
        <view class="weui-cell">
          <view class="weui-cell__bd"><text>{{info.city}}</text></view>
          <view class="weui-cell__ft">Cidade</view>
        </view>
        <view class="weui-cell">
          <view class="weui-cell__bd"><text>{{info.district}}</text></view>
          <view class="weui-cell__ft">Distrito</view>
        </view>
        <view class="weui-cell">
          <view class="weui-cell__bd"><text>{{info.isp}}</text></view>
          <view class="weui-cell__ft">Operadora</view>
        </view>
        <view class="weui-cell">
          <view class="weui-cell__bd"><text>{{info.areacode}}</text></view>
          <view class="weui-cell__ft">Código de área</view>
        </view>
        <view class="weui-cell">
          <view class="weui-cell__bd"><text>{{info.en}}</text></view>
          <view class="weui-cell__ft">País (EN)</view>
        </view>
        <view class="weui-cell">
          <view class="weui-cell__bd"><text>{{info.cc}}</text></view>
          <view class="weui-cell__ft">Sigla</view>
        </view>
        <view class="weui-cell">
          <view class="weui-cell__bd"><text>{{info.lng}}</text></view>
          <view class="weui-cell__ft">Longitude</view>
        </view>
        <view class="weui-cell">
          <view class="weui-cell__bd"><text>{{info.lat}}</text></view>
          <view class="weui-cell__ft">Latitude</view>
        </view>
        <view class="weui-cell">
          <view class="weui-cell__bd"><text>{{info.version}}</text></view>
          <view class="weui-cell__ft">Versão</view>
        </view>
      </scroll-view>
      <view class="dica-scroll">Role para ver todos os dados</view>
    </view>
  </view>
</view>

search.js

Page({
  data: {
    textoBusca: '',
    foco: false,
    classeFoco: '',
    info: {}
  },

  onReady: function () {
    this.carregarExemplo();
  },

  carregarExemplo: function () {
    this.consultarIP('8.8.8.8');
  },

  consultarIP: function (ip) {
    var self = this;
    wx.request({
      url: 'https://api.exemplo.com/v1/ip', // substitua pelo endpoint real
      method: 'POST',
      data: { ip: ip },
      header: { 'content-type': 'application/x-www-form-urlencoded' },
      success: function (res) {
        if (res.data && res.data.data) {
          self.setData({ info: res.data.data });
        }
      },
      fail: function () {
        // falha na requisição
      }
    });
  },

  ativarBusca: function () {
    this.setData({
      classeFoco: 'weui-search-bar_focusing',
      foco: true
    });
  },

  cancelarBusca: function () {
    this.setData({
      classeFoco: '',
      foco: false
    });
  },

  limparBusca: function () {
    this.setData({
      textoBusca: '',
      foco: true
    });
  },

  aoDigitar: function (e) {
    this.setData({ textoBusca: e.detail.value });
  },

  confirmarBusca: function () {
    var self = this;
    var ip = this.data.textoBusca.trim();

    if (!ip) {
      return;
    }

    if (!this.ehIPv4(ip)) {
      wx.showToast({ title: 'IP inválido', image: '/images/tip.png' });
      return;
    }

    wx.showToast({ title: 'Buscando...', icon: 'loading' });

    wx.request({
      url: 'https://api.exemplo.com/v1/ip', // substitua pelo endpoint real
      method: 'POST',
      data: { ip: ip },
      header: { 'content-type': 'application/x-www-form-urlencoded' },
      success: function (res) {
        if (res.data && res.data.data) {
          self.setData({ info: res.data.data });
        }
      },
      fail: function () {
        // falha na requisição
      },
      complete: function () {
        wx.hideToast();
      }
    });
  },

  ehIPv4: function (valor) {
    return /^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$/.test(valor);
  },

  onShareAppMessage: function () {
    return {
      title: 'Consulta de IP',
      path: '/pages/index/index'
    };
  }
});

search.wxss

@import "../common/weui.wxss";

.page-section-spacing {
  margin-top: 0rpx;
}

.page-section-title {
  text-align: center;
  padding: 40rpx 0 0;
  color: #9b9b9b;
  font-size: 36rpx;
}

@media (min-width: 320px) {
  .painel-scroll {
    height: 640rpx;
  }
}

@media (min-width: 360px) {
  .painel-scroll {
    height: 816rpx;
  }
}

@media (min-width: 375px) {
  .painel-scroll {
    height: 836rpx;
  }
}

@media (min-width: 384px) {
  .painel-scroll {
    height: 826rpx;
  }
}

@media (min-width: 414px) {
  .painel-scroll {
    height: 868rpx;
  }
}

.item-scroll {
  height: 90rpx;
  line-height: 90rpx;
  color: #000;
  border-bottom: 1px solid #eee;
  text-align: center;
  vertical-align: middle;
  margin: 0 20rpx;
}

.valor-ip {
  line-height: 90rpx;
  color: #2ab059;
  display: inline-block;
  font-size: 36rpx;
}

.weui-cell__bd {
  color: #2ab059;
}

.dica-scroll {
  color: #eee;
  font-size: 20rpx;
  text-align: center;
  padding-top: 20rpx;
}

app.json

{
  "pages": [
    "pages/index/index",
    "pages/sobre/sobre"
  ],
  "window": {
    "backgroundTextStyle": "light",
    "navigationBarBackgroundColor": "#2ab059",
    "navigationBarTitleText": "Consulta de IP",
    "navigationBarTextStyle": "white"
  },
  "tabBar": {
    "color": "#7A7E83",
    "selectedColor": "#2ab059",
    "borderStyle": "black",
    "backgroundColor": "#ffffff",
    "list": [
      {
        "pagePath": "pages/index/index",
        "iconPath": "images/location.png",
        "selectedIconPath": "images/location_hl.png",
        "text": "IP"
      },
      {
        "pagePath": "pages/sobre/sobre",
        "iconPath": "images/about.png",
        "selectedIconPath": "images/about_hl.png",
        "text": "Sobre"
      }
    ]
  }
}

As requisições feitas pelo wx.request devem usar HTTPS com TLS 1.2 ou superior e o domínio precisa estar configurado no console do Mini Program.

Tags: WeChat Mini Program WXML WXSS javascript IP Geolocation

Publicado em 7-12 02:55