<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>微信 on 阿珏酱のBlog</title>
    <link>https://zh.moejue.cn/ja/tags/%E5%BE%AE%E4%BF%A1/</link>
    <description>Recent content from 阿珏酱のBlog</description>
    <generator>Hugo</generator>
    <language>ja</language>
    
    <managingEditor>xxx@example.com (MoeJue)</managingEditor>
    <webMaster>xxx@example.com (MoeJue)</webMaster>
    
    <copyright>本ブログのすべての文書は、特に指定されていない限り、BY-NC-SAライセンスに従っています。引用の際は出典を明記してください！</copyright>
    
    <lastBuildDate>Fri, 17 May 2019 06:59:47 +0000</lastBuildDate>
    
    
    <atom:link href="https://zh.moejue.cn/ja/tags/%E5%BE%AE%E4%BF%A1/index.xml" rel="self" type="application/rss&#43;xml" />
    

    
    

    <item>
      <title>ミニプログラムアーキテクチャ</title>
      <link>https://zh.moejue.cn/ja/posts/92/</link>
      <pubDate>Fri, 17 May 2019 06:59:47 &#43;0000</pubDate>
      <author>xxx@example.com (MoeJue)</author>
      <guid>https://zh.moejue.cn/ja/posts/92/</guid>
      <description>
        <![CDATA[<h1>ミニプログラムアーキテクチャ</h1><p>著者: MoeJue(xxx@example.com)</p>
        
          <p>皆さんがミニプログラムをどのように書いているかは分かりませんが、数ヶ月前にWeChatミニプログラムを書いていた時、自分で考えたアーキテクチャ、あるいはフレームワークと呼べるものがあります。
WeChatネイティブのアーキテクチャは次のようになっています。</p>
<p>├── app.js
├── app.json
├── app.wxss
├── pages
│   │── index
│   │   ├── index.wxml
│   │   ├── index.js
│   │   ├── index.json
│   │   └── index.wxss
│   └── logs
│       ├── logs.wxml
│       └── logs.js
└── utils</p>
<p>なぜWeChatネイティブの書き方を使わないのか？
ミニプログラムはスマホアプリに似ていて、tabBarがありますよね。WeChat公式のtabBarはapp.jsonでグローバルに設定されます。一般的な開発では何の問題もありませんが、複雑なtabBarを実装する場合、公式のネイティブな方法では実現できず、動的に読み込むこともできません。例えば、ある動画アプリの中央にある撮影・録画機能のようなものです。
これは、公式が提供するtabBarを使えず、自作する必要があることを意味します。
最初の私のアプローチは、ネイティブの構造を維持しつつ、tabBarだけを自作するというものでした。そのため、ページのコードはすべて1つのファイルに書き、デフォルトで最初の画面を表示し、他は非表示にします。ページを切り替える際に、対応するページを表示し、他を非表示にして、データを動的にレンダリングします。しかし、これには問題がありました。小規模なプロジェクトなら大した問題はありませんが、大規模なプロジェクトでコード量が膨大になると、すべてを1つのファイルに書くのは後のメンテナンスが困難になります。そのため、この方法は最終的に却下されました。</p>
<p>その後、ページの切り替え方法を（<code>wx.switchTab</code>などを使った）画面遷移に変更し、異なるページのコードを別々のファイルに分けました。しかし、まだ問題がありました。切り替え時に画面がちらつくのです。ページを切り替えるたびに、まるで新しいウェブページを開くかのように、tabBarが再レンダリングされるため、ちらつきが発生します。これも却下です。</p>
<p>そこで、現在の全く新しいアーキテクチャ方式が生まれました：
<code>/pages/index/</code>以下のファイルをすべてエントリーファイル（JSエントリー、CSSエントリー、ビューエントリー）として定義します。異なるページのファイルは、管理しやすいように、やはり別の場所に置きます。新しく<code>template</code>というフォルダを作成し、異なるページ間のコードを格納します。その構造は公式の単一ページの構造と同じです。
ルートディレクトリの<code>app.js</code>はグローバル関数を格納するために使用し、他のページからは<code>getApp()</code>で呼び出すだけです。
JSのエントリーファイル</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">app</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">getApp</span>();
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">index_js</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">require</span>(<span style="color:#e6db74">&#34;../../template/index/index.js&#34;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">types_js</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">require</span>(<span style="color:#e6db74">&#34;../../template/types/types.js&#34;</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">Global_Data</span> <span style="color:#f92672">=</span> [];
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Page</span>({
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">data</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">active</span><span style="color:#f92672">:</span> <span style="color:#ae81ff">0</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">show</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">index</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">true</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">types</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">false</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">course</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">false</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">user</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>    },
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">onLoad</span>(<span style="color:#a6e22e">options</span>) {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">setData</span>({
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">Global_Data</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">index_js</span>.<span style="color:#a6e22e">getData</span>()
</span></span><span style="display:flex;"><span>        })
</span></span><span style="display:flex;"><span>    },
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// 下部ナビゲーションの切り替え
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>    <span style="color:#a6e22e">tabbar_onChange</span>(<span style="color:#a6e22e">event</span>) {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">key</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;&#39;</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">data</span>.<span style="color:#a6e22e">show</span> <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">index</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">false</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">types</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">false</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">course</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">false</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">user</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span>        };
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#a6e22e">event</span>)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">switch</span> (<span style="color:#a6e22e">event</span>.<span style="color:#a6e22e">detail</span>) {
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">case</span> <span style="color:#ae81ff">0</span><span style="color:#f92672">:</span>
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">key</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;index&#39;</span>;
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">Global_Data</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">index_js</span>.<span style="color:#a6e22e">getData</span>();
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">break</span>;
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">case</span> <span style="color:#ae81ff">1</span><span style="color:#f92672">:</span>
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">key</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;types&#39;</span>;
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">Global_Data</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">types_js</span>.<span style="color:#a6e22e">getData</span>()
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">break</span>;
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">case</span> <span style="color:#ae81ff">2</span><span style="color:#f92672">:</span>
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">key</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;course&#39;</span>;
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">Global_Data</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">index_js</span>.<span style="color:#a6e22e">getData</span>();
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">break</span>;
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">case</span> <span style="color:#ae81ff">3</span><span style="color:#f92672">:</span>
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">key</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;user&#39;</span>;
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">Global_Data</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">index_js</span>.<span style="color:#a6e22e">getData</span>();
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">break</span>;
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">data</span>.<span style="color:#a6e22e">show</span>[<span style="color:#a6e22e">key</span>] <span style="color:#f92672">=</span> <span style="color:#66d9ef">true</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#a6e22e">Global_Data</span>)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">setData</span>({
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">show</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">data</span>.<span style="color:#a6e22e">show</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">Global_Data</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">Global_Data</span>
</span></span><span style="display:flex;"><span>        })
</span></span><span style="display:flex;"><span>    },
</span></span><span style="display:flex;"><span>});
</span></span></code></pre></div><p>wxmlエントリーファイル</p>
        
        <hr><p>この記事は2019-05-17に<a href='https://zh.moejue.cn/'>阿珏酱のBlog</a>で公開され、最終更新日は2019-05-17です</p>]]>
      </description>
      
        <category>折腾代码</category>
      
    </item>
    
    

    <item>
      <title>WeChatでログイン</title>
      <link>https://zh.moejue.cn/ja/posts/88/</link>
      <pubDate>Fri, 05 Apr 2019 09:29:45 &#43;0000</pubDate>
      <author>xxx@example.com (MoeJue)</author>
      <guid>https://zh.moejue.cn/ja/posts/88/</guid>
      <description>
        <![CDATA[<h1>WeChatでログイン</h1><p>著者: MoeJue(xxx@example.com)</p>
        
          <p><img src="https://res.wx.qq.com/mpres/htmledition/weui-desktopSkin/svg/buildless/bg_logo_primary4247a9.svg" alt=""> ドキュメント：<a href="https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp1421135319">https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp1421135319</a></p>
<p>WeChatの認証ログインは、QQやSinaなどのプラットフォームの認証ログインとほぼ同じで、いずれもOAuth2.0認証方式を採用しています。<br>
WeChatの認証は2種類に分かれています：</p>
<ol>
<li>サイレント認証</li>
<li>ポップアップ認証、ユーザーの手動同意が必要</li>
</ol>
<p>2種類のscopeの違いについて</p>
<ol>
<li><code>snsapi_base</code>をscopeとして開始されるウェブ認証は、ページにアクセスしたユーザーのopenidを取得するためのもので、サイレント認証であり、自動的にコールバックページにリダイレクトされます。ユーザーは直接コールバックページ（通常は業務ページ）にアクセスしたように感じます。</li>
<li><code>snsapi_userinfo</code>をscopeとして開始されるウェブ認証は、ユーザーの基本情報を取得するためのものです。この認証はユーザーの手動同意が必要ですが、一度同意すれば、公式アカウントをフォローしていなくても、認証後にそのユーザーの基本情報を取得できます。</li>
</ol>
<p>ユーザー管理関連のAPIにおける「ユーザー基本情報取得API」は、ユーザーが公式アカウントとメッセージのやり取りをするか、フォローした後のイベントプッシュがあって初めて、ユーザーのOpenIDに基づいて基本情報を取得できます。このAPIを含む他のWeChat APIは、すべて対象ユーザー（openid）が公式アカウントをフォローしている場合にのみ、正常に呼び出すことができます。</p>
<p>具体的には、ウェブ認証のフローは4つのステップに分かれています：</p>
<ol>
<li>ユーザーを認証ページに誘導し、同意を得てcodeを取得する</li>
<li>codeを使用してウェブ認証用のaccess_tokenを取得する（基本サポートのaccess_tokenとは異なる）</li>
<li>必要に応じて、開発者はウェブ認証用のaccess_tokenを更新し、期限切れを回避する</li>
<li>ウェブ認証用のaccess_tokenとopenidを使用してユーザーの基本情報を取得する（UnionIDメカニズムをサポート）</li>
</ol>
<p>以下はカプセル化されたWeChat操作クラスです。access_tokenとticketを保存するために2つのデータテーブルを使用します。これらには有効期限があり、1日あたりのリクエスト数に上限があるため、開発者は自身で保存する必要があります。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#f92672">&lt;?</span><span style="color:#a6e22e">php</span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">/**
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">*   WeChat操作テーブル
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">*   wxtoken テーブル構造
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">*   id
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">*   access_token
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">*   addtime
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">*   wxticket テーブル構造
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">*   id
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">*   ticket
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">*   addtime
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">*/</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">WX</span> {
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">private</span> $appid;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">private</span> $appserect;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">private</span> $curl;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">private</span> $msg;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">protected</span> $errs <span style="color:#f92672">=</span> <span style="color:#66d9ef">array</span>(
</span></span><span style="display:flex;"><span>		<span style="color:#e6db74">&#39;-1&#39;</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#39;システムがビジーです。開発者はしばらくしてから再試行してください&#39;</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#e6db74">&#39;0&#39;</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#39;リクエスト成功&#39;</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#e6db74">&#39;40001&#39;</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#39;AppSecretが間違っているか、この公式アカウントのものではありません。開発者はAppSecretが正しいことを確認してください&#39;</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#e6db74">&#39;40002&#39;</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#39;grant_typeフィールドの値がclient_credentialであることを確認してください&#39;</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#e6db74">&#39;40164&#39;</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#39;APIを呼び出したIPアドレスがホワイトリストにありません。APIのIPホワイトリストで設定してください。&#39;</span>,
</span></span><span style="display:flex;"><span>	);
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">function</span> <span style="color:#a6e22e">__construct</span>($appid, $appserect) {
</span></span><span style="display:flex;"><span>		$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">appid</span> <span style="color:#f92672">=</span> $appid;
</span></span><span style="display:flex;"><span>		$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">appserect</span> <span style="color:#f92672">=</span> $appserect;
</span></span><span style="display:flex;"><span>		$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">curl</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">Curl</span>();
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#75715e">/*
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">	WeChatウェブ認証ログイン 公式アカウント設定 - 機能設定 - ウェブ認証ドメインでの設定が必要
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">	第一歩：ユーザーが認証に同意し、codeを取得
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">	scope : snsapi_base openidのみ取得可能、直接リダイレクト
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">	snsapi_userinfo
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">	*/</span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">public</span> <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">getCode</span>($redirect_uri, $scope <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;snsapi_userinfo&#39;</span>,$state <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;1&#39;</span>) {
</span></span><span style="display:flex;"><span>		$url <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;https://open.weixin.qq.com/connect/oauth2/authorize?appid=</span><span style="color:#e6db74">{</span>$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">appid</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&amp;redirect_uri=</span><span style="color:#e6db74">{</span>$redirect_uri<span style="color:#e6db74">}</span><span style="color:#e6db74">&amp;response_type=code&amp;scope=</span><span style="color:#e6db74">{</span>$scope<span style="color:#e6db74">}</span><span style="color:#e6db74">&amp;state=</span><span style="color:#e6db74">{</span>$state<span style="color:#e6db74">}</span><span style="color:#e6db74">#wechat_redirect&#34;</span>;
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">header</span>(<span style="color:#e6db74">&#34;Location:</span><span style="color:#e6db74">{</span>$url<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>);
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">exit</span>;
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#75715e">/*
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">	第二歩：codeを使用してウェブ認証用のaccess_tokenを取得
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">	*/</span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">public</span> <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">getAccessTokenByCode</span>($code) {
</span></span><span style="display:flex;"><span>		$url <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;https://api.weixin.qq.com/sns/oauth2/access_token?appid=</span><span style="color:#e6db74">{</span>$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">appid</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&amp;secret=</span><span style="color:#e6db74">{</span>$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">appserect</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&amp;code=</span><span style="color:#e6db74">{</span>$code<span style="color:#e6db74">}</span><span style="color:#e6db74">&amp;grant_type=authorization_code&#34;</span>;
</span></span><span style="display:flex;"><span>		<span style="color:#75715e">// exit($url);
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>		<span style="color:#75715e">// $curl = new Curl();
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>		$result <span style="color:#f92672">=</span> $this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">curl</span><span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">doGet</span>($url);
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>$result) {
</span></span><span style="display:flex;"><span>			<span style="color:#75715e">// $this-&gt;curl-&gt;getError()
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>			$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">msg</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;トークンの取得に失敗しました&#34;</span>;
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">false</span>;
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>		$result <span style="color:#f92672">=</span> <span style="color:#a6e22e">json_decode</span>($result, <span style="color:#66d9ef">true</span>);
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">if</span> ($result[<span style="color:#e6db74">&#39;errcode&#39;</span>]) {
</span></span><span style="display:flex;"><span>			$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">msg</span> <span style="color:#f92672">=</span> $result[<span style="color:#e6db74">&#39;errmsg&#39;</span>];
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">false</span>;
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">return</span> $result;
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#75715e">// 第三歩：access_tokenを更新（必要な場合） code経由でopenidを取得 $type 0サイレント認証 1ポップアップ認証
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>	<span style="color:#66d9ef">public</span> <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">getUserInfo</span>($code, $type <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>, $lang <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;zh_CN &#39;</span>) {
</span></span><span style="display:flex;"><span>		$result <span style="color:#f92672">=</span> $this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">getAccessTokenByCode</span>($code);
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>$result) {
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">false</span>;
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>		$member <span style="color:#f92672">=</span> <span style="color:#a6e22e">C</span><span style="color:#f92672">::</span><span style="color:#a6e22e">t</span>(<span style="color:#a6e22e">PT_USER</span>)<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">getByOpenid</span>($result[<span style="color:#e6db74">&#39;openid&#39;</span>]);
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">if</span> ($member) {
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">return</span> $member;
</span></span><span style="display:flex;"><span>	} <span style="color:#66d9ef">else</span> {
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">if</span> ($type) {
</span></span><span style="display:flex;"><span>			$url <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;https://api.weixin.qq.com/sns/userinfo?access_token=</span><span style="color:#e6db74">{</span>$result[<span style="color:#e6db74">&#39;access_token&#39;</span>]<span style="color:#e6db74">}</span><span style="color:#e6db74">&amp;openid=</span><span style="color:#e6db74">{</span>$result[<span style="color:#e6db74">&#39;openid&#39;</span>]<span style="color:#e6db74">}</span><span style="color:#e6db74">&amp;lang=</span><span style="color:#e6db74">{</span>$lang<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>;
</span></span><span style="display:flex;"><span>			<span style="color:#75715e">// $return = $this-&gt;curl-&gt;doGet($url);
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>			<span style="color:#75715e">// このAPIは挙動がおかしく、強制的にファイルヘッダーを表示します
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>			$return <span style="color:#f92672">=</span> <span style="color:#a6e22e">file_get_contents</span>($url);
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>$return) {
</span></span><span style="display:flex;"><span>				$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">msg</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;ユーザー情報の取得に失敗しました&#39;</span>;
</span></span><span style="display:flex;"><span>				<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">false</span>;
</span></span><span style="display:flex;"><span>			}
</span></span><span style="display:flex;"><span>			$return <span style="color:#f92672">=</span> <span style="color:#a6e22e">json_decode</span>($return, <span style="color:#66d9ef">true</span>);
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>$return) {
</span></span><span style="display:flex;"><span>				$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">msg</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;ユーザー情報の取得リターンに失敗しました&#39;</span>;
</span></span><span style="display:flex;"><span>				<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">false</span>;
</span></span><span style="display:flex;"><span>			}
</span></span><span style="display:flex;"><span>			<span style="color:#75715e">// file_put_contents(&#39;ccc.txt&#39;,print_r($return,true),FILE_APPEND);
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>			$data <span style="color:#f92672">=</span> <span style="color:#66d9ef">array</span>(
</span></span><span style="display:flex;"><span>				<span style="color:#e6db74">&#39;openid&#39;</span> <span style="color:#f92672">=&gt;</span> $return[<span style="color:#e6db74">&#39;openid&#39;</span>],
</span></span><span style="display:flex;"><span>				<span style="color:#e6db74">&#39;name&#39;</span> <span style="color:#f92672">=&gt;</span> $return[<span style="color:#e6db74">&#39;nickname&#39;</span>],
</span></span><span style="display:flex;"><span>				<span style="color:#e6db74">&#39;sex&#39;</span> <span style="color:#f92672">=&gt;</span> $return[<span style="color:#e6db74">&#39;sex&#39;</span>],
</span></span><span style="display:flex;"><span>				<span style="color:#e6db74">&#39;province&#39;</span> <span style="color:#f92672">=&gt;</span> $return[<span style="color:#e6db74">&#39;province&#39;</span>],
</span></span><span style="display:flex;"><span>				<span style="color:#e6db74">&#39;city&#39;</span> <span style="color:#f92672">=&gt;</span> $return[<span style="color:#e6db74">&#39;city&#39;</span>],
</span></span><span style="display:flex;"><span>				<span style="color:#e6db74">&#39;country&#39;</span> <span style="color:#f92672">=&gt;</span> $return[<span style="color:#e6db74">&#39;country&#39;</span>],
</span></span><span style="display:flex;"><span>				<span style="color:#e6db74">&#39;img&#39;</span> <span style="color:#f92672">=&gt;</span> $return[<span style="color:#e6db74">&#39;headimgurl&#39;</span>],
</span></span><span style="display:flex;"><span>				<span style="color:#e6db74">&#39;bindtel&#39;</span> <span style="color:#f92672">=&gt;</span> <span style="color:#ae81ff">0</span>,
</span></span><span style="display:flex;"><span>			);
</span></span><span style="display:flex;"><span>		} <span style="color:#66d9ef">else</span> {
</span></span><span style="display:flex;"><span>			$data <span style="color:#f92672">=</span> <span style="color:#66d9ef">array</span>(
</span></span><span style="display:flex;"><span>				<span style="color:#e6db74">&#39;openid&#39;</span> <span style="color:#f92672">=&gt;</span> $result[<span style="color:#e6db74">&#39;openid&#39;</span>],
</span></span><span style="display:flex;"><span>				<span style="color:#e6db74">&#39;username&#39;</span> <span style="color:#f92672">=&gt;</span> <span style="color:#e6db74">&#34;WeChatユーザー_&#34;</span> <span style="color:#f92672">.</span> <span style="color:#a6e22e">random</span>(<span style="color:#ae81ff">6</span>,<span style="color:#ae81ff">1</span>)
</span></span><span style="display:flex;"><span>			);
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>		$name <span style="color:#f92672">=</span> <span style="color:#a6e22e">rand</span>(<span style="color:#ae81ff">100000</span>, <span style="color:#ae81ff">1000000000</span>);
</span></span><span style="display:flex;"><span>		$e <span style="color:#f92672">=</span> $name <span style="color:#f92672">.</span> <span style="color:#e6db74">&#34;@qq.com&#34;</span>;
</span></span><span style="display:flex;"><span>		$password <span style="color:#f92672">=</span> $e;
</span></span><span style="display:flex;"><span>		$id <span style="color:#f92672">=</span> <span style="color:#a6e22e">UserAddEdit</span>(<span style="color:#ae81ff">0</span>, $data[<span style="color:#e6db74">&#39;username&#39;</span>], $password, $e,<span style="color:#ae81ff">10</span>,<span style="color:#ae81ff">0</span>,<span style="color:#e6db74">&#34;&#34;</span>, $msg);
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">if</span> ($id <span style="color:#f92672">&lt;=</span> <span style="color:#ae81ff">0</span>) {
</span></span><span style="display:flex;"><span>			$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">msg</span> <span style="color:#f92672">=</span> $msg;
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">false</span>;
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">C</span><span style="color:#f92672">::</span><span style="color:#a6e22e">t</span>(<span style="color:#a6e22e">PT_USER</span>)<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">update</span>($data, $id);
</span></span><span style="display:flex;"><span>		$member <span style="color:#f92672">=</span> <span style="color:#a6e22e">C</span><span style="color:#f92672">::</span><span style="color:#a6e22e">t</span>(<span style="color:#a6e22e">PT_USER</span>)<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">get</span>($id);
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">return</span> $member;
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#75715e">/*
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">	公式アカウント セキュリティセンターでIPホワイトリストを設定
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">	公式アカウントのグローバルでユニークなAPI呼び出し資格情報。公式アカウントが各APIを呼び出す際にはaccess_tokenを使用する必要があります。開発者は適切に保存する必要があります。access_tokenの保存には少なくとも512文字のスペースを確保してください。access_tokenの有効期間は現在2時間で、定期的に更新する必要があります。重複して取得すると、前回取得したaccess_tokenが無効になります。
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">	*/</span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">public</span> <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">getAccessToken</span>($type) {
</span></span><span style="display:flex;"><span>		$addtime <span style="color:#f92672">=</span> <span style="color:#a6e22e">TIMESTAMP</span> <span style="color:#f92672">-</span> <span style="color:#ae81ff">7200</span>;
</span></span><span style="display:flex;"><span>		$url <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&amp;appid=</span><span style="color:#e6db74">{</span>$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">appid</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&amp;secret=</span><span style="color:#e6db74">{</span>$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">appserect</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>;
</span></span><span style="display:flex;"><span>		$row <span style="color:#f92672">=</span> <span style="color:#a6e22e">C</span><span style="color:#f92672">::</span><span style="color:#a6e22e">t</span>(<span style="color:#a6e22e">PT_WXTOKEN</span>)<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">getNew</span>($addtime, $type);
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">if</span> ($row) {
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">return</span> $row[<span style="color:#e6db74">&#39;access_token&#39;</span>];
</span></span><span style="display:flex;"><span>		} <span style="color:#66d9ef">else</span> {
</span></span><span style="display:flex;"><span>			$result <span style="color:#f92672">=</span> $this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">curl</span><span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">doGet</span>($url);
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>$result) {
</span></span><span style="display:flex;"><span>				$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">msg</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;トークンコンテンツを取得できません&#34;</span>;
</span></span><span style="display:flex;"><span>				<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">false</span>;
</span></span><span style="display:flex;"><span>			}
</span></span><span style="display:flex;"><span>			$result <span style="color:#f92672">=</span> <span style="color:#a6e22e">json_decode</span>($result, <span style="color:#66d9ef">true</span>);
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>$result) {
</span></span><span style="display:flex;"><span>				$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">msg</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;トークンコンテンツの解析に失敗しました&#34;</span>;
</span></span><span style="display:flex;"><span>				<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">false</span>;
</span></span><span style="display:flex;"><span>			}
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">if</span> ($result[<span style="color:#e6db74">&#39;access_token&#39;</span>]) {
</span></span><span style="display:flex;"><span>				<span style="color:#a6e22e">C</span><span style="color:#f92672">::</span><span style="color:#a6e22e">t</span>(<span style="color:#a6e22e">PT_WXTOKEN</span>)<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">addToken</span>($result[<span style="color:#e6db74">&#39;access_token&#39;</span>], $type);
</span></span><span style="display:flex;"><span>				<span style="color:#66d9ef">return</span> $result[<span style="color:#e6db74">&#39;access_token&#39;</span>];
</span></span><span style="display:flex;"><span>			} <span style="color:#66d9ef">else</span> {
</span></span><span style="display:flex;"><span>				$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">msg</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;トークンの取得に失敗しました&#34;</span>;
</span></span><span style="display:flex;"><span>				<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">false</span>;
</span></span><span style="display:flex;"><span>			}
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#75715e">// JSチケットを取得 公式アカウント設定 - 機能設定 - JSインターフェースセキュアドメインでの設定が必要
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>	<span style="color:#66d9ef">public</span> <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">getJsTicket</span>() {
</span></span><span style="display:flex;"><span>		$addtime <span style="color:#f92672">=</span> <span style="color:#a6e22e">TIMESTAMP</span> <span style="color:#f92672">-</span> <span style="color:#ae81ff">7200</span>;
</span></span><span style="display:flex;"><span>		$row <span style="color:#f92672">=</span> <span style="color:#a6e22e">C</span><span style="color:#f92672">::</span><span style="color:#a6e22e">t</span>(<span style="color:#a6e22e">PT_WXTICKET</span>)<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">getNew</span>($addtime);
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">if</span> ($row) {
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">return</span> $row[<span style="color:#e6db74">&#39;ticket&#39;</span>];
</span></span><span style="display:flex;"><span>		} <span style="color:#66d9ef">else</span> {
</span></span><span style="display:flex;"><span>			$token <span style="color:#f92672">=</span> $this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">getAccessToken</span>();
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>$token) {
</span></span><span style="display:flex;"><span>				<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">false</span>;
</span></span><span style="display:flex;"><span>			}
</span></span><span style="display:flex;"><span>			$url <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=</span><span style="color:#e6db74">{</span>$token<span style="color:#e6db74">}</span><span style="color:#e6db74">&amp;type=jsapi&#34;</span>;
</span></span><span style="display:flex;"><span>			$result <span style="color:#f92672">=</span> $this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">curl</span><span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">doGet</span>($url);
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>$result) {
</span></span><span style="display:flex;"><span>				$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">msg</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;JSチケットを取得できません&#34;</span>;
</span></span><span style="display:flex;"><span>				<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">false</span>;
</span></span><span style="display:flex;"><span>			}
</span></span><span style="display:flex;"><span>			$result <span style="color:#f92672">=</span> <span style="color:#a6e22e">json_decode</span>($result, <span style="color:#66d9ef">true</span>);
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>$result) {
</span></span><span style="display:flex;"><span>				$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">msg</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;JSチケットコンテンツの解析に失敗しました&#34;</span>;
</span></span><span style="display:flex;"><span>				<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">false</span>;
</span></span><span style="display:flex;"><span>			}
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">if</span> ($result[<span style="color:#e6db74">&#39;ticket&#39;</span>]) {
</span></span><span style="display:flex;"><span>				<span style="color:#a6e22e">C</span><span style="color:#f92672">::</span><span style="color:#a6e22e">t</span>(<span style="color:#a6e22e">PT_WXTICKET</span>)<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">addTicket</span>($result[<span style="color:#e6db74">&#39;ticket&#39;</span>]);
</span></span><span style="display:flex;"><span>				<span style="color:#66d9ef">return</span> $result[<span style="color:#e6db74">&#39;ticket&#39;</span>];
</span></span><span style="display:flex;"><span>			} <span style="color:#66d9ef">else</span> {
</span></span><span style="display:flex;"><span>				$this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">msg</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;JSチケットの取得に失敗しました&#34;</span>;
</span></span><span style="display:flex;"><span>				<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">false</span>;
</span></span><span style="display:flex;"><span>			}
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#75715e">// js sdk チケット署名 現在のウェブページのURL、#およびそれ以降の部分は含まない
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>	<span style="color:#66d9ef">public</span> <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">jsSign</span>($data) {
</span></span><span style="display:flex;"><span>		<span style="color:#75715e">// 1.署名対象のすべてのパラメータをフィールド名のASCIIコード順（辞書順）でソートする
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>		<span style="color:#a6e22e">ksort</span>($data);
</span></span><span style="display:flex;"><span>		<span style="color:#75715e">// 2.URLキー・バリューペアの形式（つまりkey1=value1&amp;key2=value2…）で文字列string1に連結する。元の値を使用し、URLエンコードは行わない
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>		$string1 <span style="color:#f92672">=</span> $this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">ToUrlParams</span>($data);
</span></span><span style="display:flex;"><span>		<span style="color:#75715e">// echo &#34;string1:{$string1}&lt;br/&gt;&#34;;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>		<span style="color:#75715e">// 3.string1をsha1で暗号化する
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>		$sign <span style="color:#f92672">=</span> <span style="color:#a6e22e">sha1</span>($string1);
</span></span><span style="display:flex;"><span>		<span style="color:#75715e">// echo &#34;signature:{$sign}&lt;br/&gt;&#34;;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>		<span style="color:#66d9ef">return</span> $sign;
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#75715e">// メッセージ内容を取得
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>	<span style="color:#66d9ef">public</span> <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">getMsg</span>() {
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">return</span> $this<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">msg</span>;
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#e6db74">/**
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">	* パラメータをURLパラメータ形式にフォーマットする
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">	*/</span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">public</span> <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">ToUrlParams</span>($data) {
</span></span><span style="display:flex;"><span>		$buff <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;&#34;</span>;
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">foreach</span> ($data <span style="color:#66d9ef">as</span> $k <span style="color:#f92672">=&gt;</span> $v) {
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">if</span> ($k <span style="color:#f92672">!=</span> <span style="color:#e6db74">&#34;sign&#34;</span> <span style="color:#f92672">&amp;&amp;</span> $v <span style="color:#f92672">!=</span> <span style="color:#e6db74">&#34;&#34;</span> <span style="color:#f92672">&amp;&amp;</span> <span style="color:#f92672">!</span><span style="color:#a6e22e">is_array</span>($v)) {
</span></span><span style="display:flex;"><span>				$buff <span style="color:#f92672">.=</span> $k <span style="color:#f92672">.</span> <span style="color:#e6db74">&#34;=&#34;</span> <span style="color:#f92672">.</span> $v <span style="color:#f92672">.</span> <span style="color:#e6db74">&#34;&amp;&#34;</span>;
</span></span><span style="display:flex;"><span>			}
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>		$buff <span style="color:#f92672">=</span> <span style="color:#a6e22e">trim</span>($buff, <span style="color:#e6db74">&#34;&amp;&#34;</span>);
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">return</span> $buff;
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#75715e">?&gt;</span><span style="color:#960050;background-color:#1e0010">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#75715e">// WeChatログイン
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">wxlogin</span>() {
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">global</span> $_G,$identifier,$config,$wx;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>$_G[<span style="color:#e6db74">&#39;uid&#39;</span>]) {
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">if</span> ($_GET[<span style="color:#e6db74">&#39;state&#39;</span>]) {
</span></span><span style="display:flex;"><span>			<span style="color:#75715e">//コールバック
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>			$member <span style="color:#f92672">=</span> $wx<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">getUserInfo</span>($_GET[<span style="color:#e6db74">&#39;code&#39;</span>]);
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>$member) {
</span></span><span style="display:flex;"><span>				<span style="color:#66d9ef">exit</span>($wx<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">getMsg</span>());
</span></span><span style="display:flex;"><span>			}
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span><span style="color:#a6e22e">function_exists</span>(<span style="color:#e6db74">&#34;setloginstatus&#34;</span>)) {
</span></span><span style="display:flex;"><span>				<span style="color:#66d9ef">include_once</span> <span style="color:#a6e22e">libfile</span>(<span style="color:#e6db74">&#39;function/member&#39;</span>);
</span></span><span style="display:flex;"><span>			}
</span></span><span style="display:flex;"><span>			<span style="color:#75715e">// ログイン状態を設定$wx
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>			<span style="color:#a6e22e">setloginstatus</span>($member, <span style="color:#ae81ff">2592000</span>);
</span></span><span style="display:flex;"><span>			<span style="color:#a6e22e">checkfollowfeed</span>();
</span></span><span style="display:flex;"><span>			$_G[<span style="color:#e6db74">&#39;uid&#39;</span>] <span style="color:#f92672">=</span> $member[<span style="color:#e6db74">&#39;uid&#39;</span>];
</span></span><span style="display:flex;"><span>			$_G[<span style="color:#e6db74">&#39;member&#39;</span>] <span style="color:#f92672">=</span> $member;
</span></span><span style="display:flex;"><span>		} <span style="color:#66d9ef">else</span> {
</span></span><span style="display:flex;"><span>			<span style="color:#75715e">//認証をリクエスト パラメータをエンコード
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>			$redirect <span style="color:#f92672">=</span> <span style="color:#a6e22e">urlencode</span>(<span style="color:#a6e22e">getProtocol</span>() <span style="color:#f92672">.</span> $_SERVER[<span style="color:#e6db74">&#39;HTTP_HOST&#39;</span>] <span style="color:#f92672">.</span> $_SERVER[<span style="color:#e6db74">&#39;REQUEST_URI&#39;</span>]);
</span></span><span style="display:flex;"><span>			$wx<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">getCode</span>($redirect, <span style="color:#e6db74">&#39;snsapi_base&#39;</span>);
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">getProtocol</span>() {
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">return</span> <span style="color:#a6e22e">is_HTTPS</span>() <span style="color:#f92672">?</span> <span style="color:#e6db74">&#39;https://&#39;</span> <span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;http://&#39;</span>;
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">is_HTTPS</span>() {  <span style="color:#66d9ef">if</span> ($_SERVER[<span style="color:#e6db74">&#39;HTTPS&#39;</span>] <span style="color:#f92672">===</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">||</span> $_SERVER[<span style="color:#e6db74">&#39;HTTPS&#39;</span>] <span style="color:#f92672">===</span> <span style="color:#e6db74">&#39;on&#39;</span> <span style="color:#f92672">||</span> $_SERVER[<span style="color:#e6db74">&#39;SERVER_PORT&#39;</span>] <span style="color:#f92672">==</span> <span style="color:#ae81ff">443</span>) {
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">true</span>;
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">false</span>;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div>
        
        <hr><p>この記事は2019-04-05に<a href='https://zh.moejue.cn/'>阿珏酱のBlog</a>で公開され、最終更新日は2019-04-05です</p>]]>
      </description>
      
        <category>折腾代码</category>
      
    </item>
    
    

    <item>
      <title>WeChat JSAPI 決済</title>
      <link>https://zh.moejue.cn/ja/posts/89/</link>
      <pubDate>Sat, 30 Mar 2019 09:30:21 &#43;0000</pubDate>
      <author>xxx@example.com (MoeJue)</author>
      <guid>https://zh.moejue.cn/ja/posts/89/</guid>
      <description>
        <![CDATA[<h1>WeChat JSAPI 決済</h1><p>著者: MoeJue(xxx@example.com)</p>
        
          <p><img src="https://gh-proxy.com/github.com/iAJue/MoeJueBlogPic/blob/master/Images/2019/03/30/0072Vf1pgy1g1l3k211blj30ia04x74e.jpg" alt=""> 以前からWeChat関連の業務を行っていましたが、新しい技術ではないものの、これまで触れる機会がなく、いくつかの落とし穴にはまりました。そこで、時間を取って整理し、記録しておきます。
WeChat Payは全部で7種類あり、それぞれ：支払いコード決済、JSAPI決済、Native決済、APP決済、H5決済、ミニプログラム決済、顔認証決済です。
今回の業務で使用したのはWeChat JSAPI決済です。ユーザーがWeChatスキャン、公式アカウントのフォローなどの方法で販売者のH5ページに入り、<strong>WeChat内で</strong>JSSDKを呼び出して支払いを完了します。</p>
<p>ドキュメント：<a href="https://pay.weixin.qq.com/wiki/doc/api/index.html">https://pay.weixin.qq.com/wiki/doc/api/index.html</a></p>
<p>SDK：[https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=11_1</p>
<p>](<a href="https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=11_1%29JSAPI">https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=11_1)JSAPI</a>決済は、WeChat内のブラウザで開くことでWeChat Payを起動できます。効果は以下の図の通りです。
<img src="https://gh-proxy.com/github.com/iAJue/MoeJueBlogPic/blob/master/Images/2019/03/30/0072Vf1pgy1g1l36yn1sej30p91hc40b.jpg" alt="">
インターフェースコードを添付します。
コードではテンプレートエンジンを使用しています。
html：</p>
<div class="am-modal-bd">
	<img src="{$competition\['avatar'\]}" alt=""><br>
	<span style="font-size: 13px;color: #72c6ef">{$competition\['username'\]}</span><br>
	<span id="tips" style="font-size: 13px"></span>
  <ul class="ul\_box">
	<li>
		<div></div>
		<div class="label\_box">
			<label>
				<input type="radio" name="price" value="{$prices\[0\]}" checked="">
				<div class="active"><span class="am-icon-diamond"></span> {$prices\[0\]}钻</div>
			</label>
			<label>
				<input type="radio" name="price" value="{$prices\[1\]}">
				<div><span class="am-icon-diamond"></span> {$prices\[1\]}钻</div>
			</label>
			<label>
				<input type="radio" name="price" value="{$prices\[2\]}">
				<div><span class="am-icon-diamond"></span> {$prices\[2\]}钻</div>
			</label>
		</div>
	</li>
	<li>
		<div></div>
		<div class="label\_box">
			<label>
				<input type="radio" name="price" value="{$prices\[3\]}">
				<div><span class="am-icon-diamond"></span> {$prices\[3\]}钻</div>
			</label>
			<label>
				<input type="radio" name="price" value="{$prices\[4\]}">
				<div><span class="am-icon-diamond"></span> {$prices\[4\]}钻</div>
			</label>
			<label>
				<input type="number" name="price" id="price" class="input" placeholder="自定义">
			</label>
		</div>
	</li>
  </ul>
  <span style="font-size: 13px">注：1钻=1元，1钻={$activity\['offset'\]}票</span><br>
  <button type="button" class="am-btn am-btn-primary  am-radius" onclick="callpay()" style="margin-top: 5px;">立即微信支付</button>
</div>
<p>JavaScript：</p>
<p>// 投票
var offset = {$activity[&lsquo;offset&rsquo;]};
$(&rsquo;#tips&rsquo;).html(&lsquo;正在给{$competition[&lsquo;code&rsquo;]}号赠送{$prices[0]}钻=&rsquo;+({$prices[0]}*offset)+&lsquo;票&rsquo;);
$(&rsquo;#vote&rsquo;).click(function(){
$.post(&rsquo;/index/index/detailed.html?cid={$cid}&amp;aid={$aid}&rsquo;,{
formhash :&rsquo;{FORMHASH}&rsquo;,
submit:&lsquo;1&rsquo;,
type:1,
openid:&rsquo;{$_G[&lsquo;member&rsquo;][&lsquo;openid&rsquo;]}&rsquo;
},function(res){
alert(res.msg);
if (res.code == 0) {
$(&rsquo;.box-1 span&rsquo;).text(res.data.all);
$(&rsquo;.box-2 span&rsquo;).text(res.data.rank);
$(&rsquo;.box-3 span&rsquo;).text(res.data.up + &lsquo;票&rsquo;);
}
});
})
/* jQuery对象级别プラグイン拡張 */
$.fn.extend({
/* 単選框 */
hlRadio:function () {
var radioEl=$(this);
radioEl.click(function () {
var price = 0;
price = $(&lsquo;input:radio:checked&rsquo;).val();
$(&rsquo;#price&rsquo;).val(&rsquo;&rsquo;);
$(&rsquo;#tips&rsquo;).html(&lsquo;正在给{$competition[&lsquo;code&rsquo;]}号赠送&rsquo;+price+&lsquo;钻=&rsquo;+(price*offset)+&lsquo;票&rsquo;);
radioEl.siblings(&ldquo;div&rdquo;).removeClass(&ldquo;active&rdquo;);
$(this).siblings(&ldquo;div&rdquo;).addClass(&ldquo;active&rdquo;);
});
},
});
$(&ldquo;input[name=&lsquo;price&rsquo;]&rdquo;).hlRadio();
$(&rsquo;#price&rsquo;).bind(&lsquo;input propertychange&rsquo;, function(){
var price = 0;
price = $(&rsquo;#price&rsquo;).val();
$(&rsquo;#tips&rsquo;).html(&lsquo;正在给{$competition[&lsquo;code&rsquo;]}号赠送&rsquo;+price+&lsquo;钻=&rsquo;+(price*offset)+&lsquo;票&rsquo;);
})</p>
        
        <hr><p>この記事は2019-03-30に<a href='https://zh.moejue.cn/'>阿珏酱のBlog</a>で公開され、最終更新日は2019-03-30です</p>]]>
      </description>
      
        <category>折腾代码</category>
      
    </item>
    
  </channel>
</rss>
