<?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/%E7%AC%94%E8%AE%B0/</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>Sun, 06 Jul 2025 14:25:00 +0000</lastBuildDate>
    
    
    <atom:link href="https://zh.moejue.cn/ja/tags/%E7%AC%94%E8%AE%B0/index.xml" rel="self" type="application/rss&#43;xml" />
    

    
    

    <item>
      <title>Web3.0とは何か？ブロックチェーンとの関係は？</title>
      <link>https://zh.moejue.cn/ja/posts/202/</link>
      <pubDate>Mon, 17 Jun 2024 12:59:22 &#43;0000</pubDate>
      <author>xxx@example.com (MoeJue)</author>
      <guid>https://zh.moejue.cn/ja/posts/202/</guid>
      <description>
        <![CDATA[<h1>Web3.0とは何か？ブロックチェーンとの関係は？</h1><p>著者: MoeJue(xxx@example.com)</p>
        
          <p>また一つ、よくわからない言葉が出てきましたね-_-。以下に要点をまとめてみました。</p>
<h2 id="web30とは何か">
<a class="header-anchor" href="#web30%e3%81%a8%e3%81%af%e4%bd%95%e3%81%8b"></a>
web3.0とは何か
</h2><p>Web 3.0（Web3）は、次世代のインターネットの発展方向であり、より分散化され、ユーザーがコントロールし、データが保護されるネットワーク環境を構築することを目指しています。これまでのWeb 1.0（静的なウェブページ）やWeb 2.0（動的でインタラクティブなウェブページやソーシャルメディア）とは異なり、Web 3.0の核心的な理念と技術には以下の側面が含まれます。</p>
<h3 id="非中央集権化">
<a class="header-anchor" href="#%e9%9d%9e%e4%b8%ad%e5%a4%ae%e9%9b%86%e6%a8%a9%e5%8c%96"></a>
非中央集権化：
</h3><ul>
<li>ブロックチェーン技術：Web 3.0の核心はブロックチェーン技術であり、すべての取引やデータの変更を記録する分散型台帳を提供します。これは、データが単一の中央サーバーによって管理されるのではなく、複数のノードに分散されることを意味します。</li>
<li>分散型アプリケーション（DApps）：これらのアプリケーションはブロックチェーンネットワーク上で実行され、中央集権的な管理者が存在しません。DAppsのユーザーは、仲介機関を介さずに直接取引や対話を行うことができます。</li>
</ul>
<h3 id="ユーザーコントロールとデータ保護">
<a class="header-anchor" href="#%e3%83%a6%e3%83%bc%e3%82%b6%e3%83%bc%e3%82%b3%e3%83%b3%e3%83%88%e3%83%ad%e3%83%bc%e3%83%ab%e3%81%a8%e3%83%87%e3%83%bc%e3%82%bf%e4%bf%9d%e8%ad%b7"></a>
ユーザーコントロールとデータ保護：
</h3><ul>
<li>自己主権型アイデンティティ：Web 3.0では、ユーザーは自身のデジタルアイデンティティとデータを完全にコントロールできます。暗号技術を通じて、ユーザーは誰が自分のデータにアクセスできるか、またそのデータをどのように使用するかを決定できます。</li>
<li>データ所有権：ユーザーのデータは分散型ネットワーク上に保存され、大手企業による集中管理ではなく、ユーザー自身がデータの所有権を持ちます。</li>
</ul>
<h3 id="スマートコントラクト">
<a class="header-anchor" href="#%e3%82%b9%e3%83%9e%e3%83%bc%e3%83%88%e3%82%b3%e3%83%b3%e3%83%88%e3%83%a9%e3%82%af%e3%83%88"></a>
スマートコントラクト：
</h3><ul>
<li>自動実行プロトコル：スマートコントラクトは、ブロックチェーン上で実行される自動化されたプロトコルであり、特定の条件が満たされると自動的に実行されます。この技術は、金融取引、サプライチェーン管理、法的な契約など、さまざまなシーンで利用できます。</li>
<li>相互運用性：Web 3.0は、異なるブロックチェーンや分散型ネットワーク間の相互運用性を実現し、データや資産が異なるプラットフォーム間でシームレスに移動できるようにすることを目指しています。</li>
</ul>
<h3 id="トラストレスと透明性">
<a class="header-anchor" href="#%e3%83%88%e3%83%a9%e3%82%b9%e3%83%88%e3%83%ac%e3%82%b9%e3%81%a8%e9%80%8f%e6%98%8e%e6%80%a7"></a>
トラストレスと透明性：
</h3><ul>
<li>トラストレスなメカニズム：Web 3.0はブロックチェーン技術を通じてトラストレスなメカニズムを実現します。つまり、参加者はお互いを信頼したり、第三者の仲介者に依存したりすることなく、安全な取引や対話を行うことができます。</li>
<li>透明性：すべての取引やデータの変更はブロックチェーン上に記録され、公開され透明であり、改ざん不可能です。これにより、信頼性とセキュリティが向上します。</li>
</ul>
<h3 id="web-30の応用シーン">
<a class="header-anchor" href="#web-30%e3%81%ae%e5%bf%9c%e7%94%a8%e3%82%b7%e3%83%bc%e3%83%b3"></a>
Web 3.0の応用シーン
</h3><ol>
<li>分散型金融（DeFi）：スマートコントラクトとブロックチェーン技術を通じて、貸付、取引、投資などの仲介者を必要としない金融サービスを提供します。</li>
<li>デジタルアイデンティティ：ユーザーは自身のデジタルアイデンティティを作成・管理し、個人データのアクセスと使用をコントロールできます。</li>
<li>サプライチェーン管理：ブロックチェーン技術を通じて、サプライチェーンの透明性と追跡可能性を実現し、偽造や詐欺を防止します。</li>
<li>コンテンツ制作と配信：アーティスト、ミュージシャン、作家は、直接視聴者と対話し取引を行うことで、より公平な収益分配を得ることができます。</li>
</ol>
<h2 id="ではブロックチェーンとは何か">
<a class="header-anchor" href="#%e3%81%a7%e3%81%af%e3%83%96%e3%83%ad%e3%83%83%e3%82%af%e3%83%81%e3%82%a7%e3%83%bc%e3%83%b3%e3%81%a8%e3%81%af%e4%bd%95%e3%81%8b"></a>
では、ブロックチェーンとは何か？
</h2><p>ブロックチェーン技術は、分散型台帳技術（Distributed Ledger Technology, DLT）の一種であり、取引や情報を記録するための改ざん不可能で非中央集権的なデータベースです。ブロックチェーン技術の核心的な考え方は、非中央集権的な方法でデータの安全性、透明性、信頼性を実現することです。</p>
<h3 id="ブロックチェーンの基本原理">
<a class="header-anchor" href="#%e3%83%96%e3%83%ad%e3%83%83%e3%82%af%e3%83%81%e3%82%a7%e3%83%bc%e3%83%b3%e3%81%ae%e5%9f%ba%e6%9c%ac%e5%8e%9f%e7%90%86"></a>
ブロックチェーンの基本原理
</h3><ol>
<li>
<p>ブロック（Block）：</p>
<ul>
<li>ブロックは取引記録を含むデータパッケージです。各ブロックには複数の取引と、そのブロックを一位に識別するためのハッシュ値が含まれています。</li>
<li>ブロックには前のブロックのハッシュ値も含まれており、これによりすべてのブロックが鎖のようにつながり、ブロックチェーンを形成します。</li>
</ul>
</li>
<li>
<p>チェーン（Chain）：</p>
<ul>
<li>ブロックはハッシュ値によって相互に連結され、チェーン構造を形成します。各ブロックが前のブロックのハッシュ値を含むため、ブロックチェーン内のデータを改ざんすることは非常に困難です。</li>
<li>あるブロックのデータを変更しようとすると、そのブロックおよびそれに続くすべてのブロックのハッシュ値が変化するため、これらすべてのブロックのハッシュ値を再計算する必要があり、これはほぼ不可能です。</li>
</ul>
</li>
<li>
<p>非中央集権化（Decentralization）：</p>
<ul>
<li>ブロックチェーンネットワーク内のすべてのノード（コンピュータ）は、ブロックチェーンの完全なコピーを保持しており、これらのコピーはコンセンサスメカニズムによって一貫性が保たれています。</li>
<li>中央機関がブロックチェーンを管理・制御することはなく、データはすべてのノードによって共同で維持されます。</li>
</ul>
</li>
<li>
<p>コンセンサスメカニズム（Consensus Mechanism）：</p>
<ul>
<li>ブロックチェーンネットワークは、すべてのノードがブロックチェーンの状態について合意に達することを保証するためにコンセンサスメカニズムを使用します。一般的なコンセンサスメカニズムには、プルーフ・オブ・ワーク（Proof of Work, PoW）やプルーフ・オブ・ステーク（Proof of Stake, PoS）があります。</li>
<li>プルーフ・オブ・ワーク（PoW）：マイナーが複雑な数学的問題を解くことで取引を検証し、ブロックチェーンに追加します。問題を解くには大量の計算能力が必要であり、これによりブロックチェーンのセキュリティが確保されます。</li>
<li>プルーフ・オブ・ステーク（PoS）：バリデーターが保有する暗号資産の量やその他の要因に基づいて取引を検証し、それに応じた報酬を得ます。</li>
</ul>
</li>
<li>
<p>暗号技術（Cryptography）：</p>
        
        <hr><p>この記事は2024-06-17に<a href='https://zh.moejue.cn/'>阿珏酱のBlog</a>で公開され、最終更新日は2025-07-06です</p>]]>
      </description>
      
        <category>教程</category>
      
    </item>
    
    

    <item>
      <title>マルチチェーン対応は、想像以上に複雑だ</title>
      <link>https://zh.moejue.cn/ja/posts/269/</link>
      <pubDate>Sat, 05 Jul 2025 08:20:55 &#43;0000</pubDate>
      <author>xxx@example.com (MoeJue)</author>
      <guid>https://zh.moejue.cn/ja/posts/269/</guid>
      <description>
        <![CDATA[<h1>マルチチェーン対応は、想像以上に複雑だ</h1><p>著者: MoeJue(xxx@example.com)</p>
        
          <h4 id="初めてのマルチチェーンウォレット統合の実践的考察">
<a class="header-anchor" href="#%e5%88%9d%e3%82%81%e3%81%a6%e3%81%ae%e3%83%9e%e3%83%ab%e3%83%81%e3%83%81%e3%82%a7%e3%83%bc%e3%83%b3%e3%82%a6%e3%82%a9%e3%83%ac%e3%83%83%e3%83%88%e7%b5%b1%e5%90%88%e3%81%ae%e5%ae%9f%e8%b7%b5%e7%9a%84%e8%80%83%e5%af%9f"></a>
初めてのマルチチェーンウォレット統合の実践的考察
</h4><p>ようやく時間ができてコードを整理できるようになりました。Web3プロジェクトでマルチチェーンウォレット接続機能を導入する際、主にEthereum、Polygon、BSC、Solanaが関わってきます。一見すると「互換性のあるロジックをいくつか追加するだけ」のように思えますが、実際に実装してみると、多くのことが思ったほど単純ではないと気づきました。</p>
<pre tabindex="0"><code>this.networkConfigs = {
    ethereum: {
        chainId: &#39;0x1&#39;, // 1
        chainName: &#39;Ethereum Mainnet&#39;,
        nativeCurrency: {
            name: &#39;Ethereum&#39;,
            symbol: &#39;ETH&#39;,
            decimals: 18
        },
        rpcUrls: [&#39;https://eth-mainnet.public.blastapi.io&#39;],
        blockExplorerUrls: [&#39;https://etherscan.io&#39;]
    },
    polygon: {
        chainId: &#39;0x89&#39;, // 137
        chainName: &#39;Polygon Mainnet&#39;,
        nativeCurrency: {
            name: &#39;MATIC&#39;,
            symbol: &#39;MATIC&#39;,
            decimals: 18
        },
        rpcUrls: [&#39;https://polygon-rpc.com&#39;],
        blockExplorerUrls: [&#39;https://polygonscan.com&#39;]
    },
    bsc: {
        chainId: &#39;0x38&#39;, // 56
        chainName: &#39;BNB Smart Chain&#39;,
        nativeCurrency: {
            name: &#39;BNB&#39;,
            symbol: &#39;BNB&#39;,
            decimals: 18
        },
        rpcUrls: [&#39;https://bsc-dataseed.binance.org&#39;],
        blockExplorerUrls: [&#39;https://bscscan.com&#39;]
    }
}
</code></pre><h4 id="マルチチェーンは単に複数のウォレットをサポートすることではない">
<a class="header-anchor" href="#%e3%83%9e%e3%83%ab%e3%83%81%e3%83%81%e3%82%a7%e3%83%bc%e3%83%b3%e3%81%af%e5%8d%98%e3%81%ab%e8%a4%87%e6%95%b0%e3%81%ae%e3%82%a6%e3%82%a9%e3%83%ac%e3%83%83%e3%83%88%e3%82%92%e3%82%b5%e3%83%9d%e3%83%bc%e3%83%88%e3%81%99%e3%82%8b%e3%81%93%e3%81%a8%e3%81%a7%e3%81%af%e3%81%aa%e3%81%84"></a>
マルチチェーンは単に「複数のウォレットをサポートする」ことではない
</h4><p>最も強く感じたのは、チェーンが異なればウォレットのインタラクション方法も異なり、SDKの考え方すら違うということです。イーサリアムエコシステムでは統一されたWeb3.jsで多くのロジックを処理できますが、Solanaになると、完全に別のシステムであることがわかります。プロバイダーの接続、接続フロー、PublicKeyの構築方法が異なり、ネットワークの遅延や安定性までもがユーザー体験に影響を与えます。</p>
        
        <hr><p>この記事は2025-07-05に<a href='https://zh.moejue.cn/'>阿珏酱のBlog</a>で公開され、最終更新日は2025-07-05です</p>]]>
      </description>
      
        <category>折腾代码</category>
      
    </item>
    
    

    <item>
      <title>Git の簡単な使用手順</title>
      <link>https://zh.moejue.cn/ja/posts/64/</link>
      <pubDate>Tue, 03 Apr 2018 12:04:32 &#43;0000</pubDate>
      <author>xxx@example.com (MoeJue)</author>
      <guid>https://zh.moejue.cn/ja/posts/64/</guid>
      <description>
        <![CDATA[<h1>Git の簡単な使用手順</h1><p>著者: MoeJue(xxx@example.com)</p>
        
          <p>この記事では概念的な知識については詳しく説明しません。ただのメモです。これは単なるステップバイステップのガイドです。障害に遭遇した場合は、Google で調べてください。</p>
<ul>
<li>SSH を使用して Git と GitHub 間のバインドを完了します</li>
</ul>
<p>1\。 「SSHキー」を生成する</p>
<p>ssh-keygen-trsa</p>
<p>RSA アルゴリズムを指定してキーを生成すると、id_rsa と id_rsa.pub という 2 つのファイル、つまりキー id_rsa と公開キー id_rsa.pub が生成されます。これら 2 つのファイルについては、</p>
<p>2\。 SSHキーを追加する
github.com -&gt; 設定 -&gt; SSH と GPG -&gt; 新しい SSH キー
公開キー id_rsa.pub の内容をキーの場所に貼り付け (タイトルの内容を入力しなくても問題ありません)、[SSH キーの追加] をクリックします。</p>
<p>3\。バインドが成功したかどうかを確認する</p>
<p>ssh -T <a href="mailto:git@github.com">git@github.com</a></p>
<ul>
<li>ローカルプロジェクトをgithubにプッシュするコマンド</li>
</ul>
<p>(1) ディレクトリを開きます</p>
<p>CDデモ</p>
<p>(2) gitファイルを生成するためにバージョンライブラリを初期化する</p>
<p>gitの初期化</p>
<p>(3) 全ファイルをキャッシュ領域に追加</p>
<p>git add *</p>
<p>(4) 現在のワークスペースに変更を送信します。</p>
<p>git commit -m &ldquo;最初のコミット&rdquo;</p>
<p>(5) 倉庫をリモートサーバーに接続する</p>
<p>git Remote addorigin <server> (上記のウェアハウスのアドレスです)</p>
<p>(6) 追加したサーバーに変更をプッシュします</p>
        
        <hr><p>この記事は2018-04-03に<a href='https://zh.moejue.cn/'>阿珏酱のBlog</a>で公開され、最終更新日は2025-06-02です</p>]]>
      </description>
      
        <category>教程</category>
      
    </item>
    
    

    <item>
      <title>[ノート]Git常用コマンド大全</title>
      <link>https://zh.moejue.cn/ja/posts/57/</link>
      <pubDate>Sat, 16 Jun 2018 08:56:21 &#43;0000</pubDate>
      <author>xxx@example.com (MoeJue)</author>
      <guid>https://zh.moejue.cn/ja/posts/57/</guid>
      <description>
        <![CDATA[<h1>[ノート]Git常用コマンド大全</h1><p>著者: MoeJue(xxx@example.com)</p>
        
          <p>前回に引き続き、時間を見つけてGitの主要なコマンドをまとめました。非常に素晴らしい、高解像度（1759*3162）のチートシートを見つけました。</p>
<p>ファイルの表示、追加、コミット、削除、復元、変更のリセット</p>
<p>git help <command> # <command>のヘルプを表示</p>
<p>git show # 特定のコミットの内容を表示 git show $id</p>
<p>git co &ndash; <file> # ワークスペースの変更を破棄</p>
<p>git co . # ワークスペースの変更を破棄</p>
<p>git add <file> # 作業ファイルの変更をローカルのステージングエリアにコミット</p>
<p>git add . # 変更されたすべての作業ファイルをステージングエリアにコミット</p>
<p>git rm <file> # バージョン管理からファイルを削除</p>
<p>git rm <file> &ndash;cached # バージョン管理からファイルを削除するが、ファイル自体は削除しない</p>
<p>git reset <file> # ステージングエリアから作業ファイルに復元</p>
<p>git reset &ndash; . # ステージングエリアから作業ファイルに復元</p>
<p>git reset &ndash;hard # 直近のコミットの状態に戻す。つまり、前回のコミット以降のすべての変更を破棄</p>
<p>git ci <file> git ci . git ci -a # git add, git rm, git ciなどの操作を一度にまとめて実行　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　git ci -am &ldquo;some comments&rdquo;</p>
        
        <hr><p>この記事は2018-06-16に<a href='https://zh.moejue.cn/'>阿珏酱のBlog</a>で公開され、最終更新日は2025-06-02です</p>]]>
      </description>
      
        <category>折腾代码</category>
      
    </item>
    
    

    <item>
      <title>[メモ] Git よく使うコマンド大全（シーン別）</title>
      <link>https://zh.moejue.cn/ja/posts/264/</link>
      <pubDate>Mon, 02 Jun 2025 06:58:42 &#43;0000</pubDate>
      <author>xxx@example.com (MoeJue)</author>
      <guid>https://zh.moejue.cn/ja/posts/264/</guid>
      <description>
        <![CDATA[<h1>[メモ] Git よく使うコマンド大全（シーン別）</h1><p>著者: MoeJue(xxx@example.com)</p>
        
          <blockquote>
<p>日常の開発でよく使われるGitの操作をまとめたものです。カテゴリ別に整理されているため、すぐに使い始めたい方や、コマンドを確認したい時に役立ちます。</p>
</blockquote>
<hr>
<h2 id="-基本コマンド">
<a class="header-anchor" href="#-%e5%9f%ba%e6%9c%ac%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89"></a>
📦 基本コマンド
</h2><p>コマンド</p>
<p>役割</p>
<p><code>git init</code></p>
<p>Gitリポジトリを初期化します（<code>.git</code>フォルダを作成）。</p>
<p><code>git clone &lt;url&gt;</code></p>
<p>リモートリポジトリをローカルにクローンします。</p>
<p><code>git status</code></p>
<p>現在のワーキングディレクトリの状態（ファイルの変更、ステージングなど）を確認します。</p>
<p><code>git add &lt;file&gt;</code></p>
<p>ファイルをステージングエリアに追加します。</p>
<p><code>git commit -m &quot;message&quot;</code></p>
<p>ステージングエリアのファイルをローカルリポジトリにコミットし、コミットメッセージを追加します。</p>
<p><code>git log</code></p>
<p>コミット履歴を表示します。</p>
<hr>
<h2 id="-ブランチ管理">
<a class="header-anchor" href="#-%e3%83%96%e3%83%a9%e3%83%b3%e3%83%81%e7%ae%a1%e7%90%86"></a>
🌱 ブランチ管理
</h2><p>コマンド</p>
<p>役割</p>
<p><code>git branch</code></p>
<p>ローカルブランチの一覧を表示します。</p>
<p><code>git branch &lt;branch-name&gt;</code></p>
<p>新しいブランチを作成します。</p>
<p><code>git checkout &lt;branch-name&gt;</code></p>
<p>指定したブランチに切り替えます。</p>
<p><code>git switch &lt;branch-name&gt;</code></p>
<p>指定したブランチに切り替えます（推奨される新しいコマンド）。</p>
<p><code>git merge &lt;branch-name&gt;</code></p>
<p>指定したブランチを現在のブランチにマージします。</p>
<p><code>git branch -d &lt;branch-name&gt;</code></p>
<p>マージ済みのブランチを削除します。</p>
<p><code>git branch -D &lt;branch-name&gt;</code></p>
<p>ブランチを強制的に削除します。</p>
<hr>
<h2 id="-リモートリポジトリ操作">
<a class="header-anchor" href="#-%e3%83%aa%e3%83%a2%e3%83%bc%e3%83%88%e3%83%aa%e3%83%9d%e3%82%b8%e3%83%88%e3%83%aa%e6%93%8d%e4%bd%9c"></a>
🌍 リモートリポジトリ操作
</h2><p>コマンド</p>
<p>役割</p>
<p><code>git remote -v</code></p>
        
        <hr><p>この記事は2025-06-02に<a href='https://zh.moejue.cn/'>阿珏酱のBlog</a>で公開され、最終更新日は2025-06-02です</p>]]>
      </description>
      
        <category>教程</category>
      
    </item>
    
    

    <item>
      <title>感熱ブルートゥースプリンター開発</title>
      <link>https://zh.moejue.cn/ja/posts/100/</link>
      <pubDate>Tue, 05 Nov 2019 14:49:50 &#43;0000</pubDate>
      <author>xxx@example.com (MoeJue)</author>
      <guid>https://zh.moejue.cn/ja/posts/100/</guid>
      <description>
        <![CDATA[<h1>感熱ブルートゥースプリンター開発</h1><p>著者: MoeJue(xxx@example.com)</p>
        
          <p>最近、レシート印刷の作業をしており、プロジェクトの要件としてiOSとAndroidの両方で実装する必要がありました。最初は全く分からず、インターネットで多くの資料を探し、たくさんの落とし穴にはまり、多くの記事を読みましたが、結果的にはうまくいきました。
Bluetoothプリンターは一般的に、レシート印刷とラベル印刷の2種類の印刷モードに分けられます。</p>
<p>会社が購入した粗悪なプリンターには開発ドキュメントすらなく、多くの落とし穴にはまる羽目になりました。開発担当者に購入時に相談してくれればよかったのに。
現在、WeChatミニプログラムでBluetoothプリンターに接続する <code>wx.createBLEConnection</code> は、iOSデバイスでは問題なく動作しますが、一部のAndroidスマートフォンでは異常が発生します（接続時にシステムペアリングボックスがポップアップ表示され、キャンセルをタップしても、ペアリングコードを入力して確定をタップしても、すぐに接続が切断されます。入力もキャンセルもしない場合、30秒以内にBluetoothプリンターから自動的に切断されます）。</p>
<p>現在採用している方法は、AndroidとiOSそれぞれにBluetooth印刷コマンドのセットを作成することです。
<strong>IOS</strong></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:#75715e">// ====================蓝牙操作==================  //初始化蓝牙模块
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">openBluetoothAdapter</span>() {
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">sysinfo</span>.<span style="color:#a6e22e">provider</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">1</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">app</span>.<span style="color:#a6e22e">onBluetooth</span>()
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">setTimeout</span>(() =&gt; {
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">android_search</span>()
</span></span><span style="display:flex;"><span>        }, <span style="color:#ae81ff">2000</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:#66d9ef">this</span>.<span style="color:#a6e22e">closeBluetoothAdapter</span>()
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">uni</span>.<span style="color:#a6e22e">openBluetoothAdapter</span>({
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">success</span><span style="color:#f92672">:</span> (<span style="color:#a6e22e">res</span>) =&gt; {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#e6db74">&#34;初始化蓝牙模块: &#34;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">JSON</span>.<span style="color:#a6e22e">stringify</span>(<span style="color:#a6e22e">res</span>));
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">startBluetoothDevicesDiscovery</span>()
</span></span><span style="display:flex;"><span>        },
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">fail</span><span style="color:#f92672">:</span> (<span style="color:#a6e22e">res</span>) =&gt; {
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">errCode</span> <span style="color:#f92672">===</span> <span style="color:#ae81ff">10001</span>) {
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">uni</span>.<span style="color:#a6e22e">onBluetoothAdapterStateChange</span>((<span style="color:#a6e22e">res</span>) =&gt; {
</span></span><span style="display:flex;"><span>                    <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#e6db74">&#39;监听蓝牙适配器状态变化事件&#39;</span>, <span style="color:#a6e22e">res</span>)
</span></span><span style="display:flex;"><span>                    <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">available</span> <span style="color:#f92672">==</span> <span style="color:#66d9ef">false</span>) {
</span></span><span style="display:flex;"><span>                        <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">global_printing</span> <span style="color:#f92672">=</span> {}
</span></span><span style="display:flex;"><span>                        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">connected</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span>                        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">chs</span> <span style="color:#f92672">=</span> []
</span></span><span style="display:flex;"><span>                        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">canWrite</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:#66d9ef">if</span> (<span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">available</span>) {
</span></span><span style="display:flex;"><span>                        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">startBluetoothDevicesDiscovery</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">if</span> (<span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">errCode</span>) {
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">alert</span>(<span style="color:#e6db74">&#39;初始化蓝牙失败，错误码：&#39;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">errCode</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:#a6e22e">app</span>.<span style="color:#a6e22e">alert</span>(<span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">errMsg</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></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">getBluetoothAdapterState</span>() {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">uni</span>.<span style="color:#a6e22e">getBluetoothAdapterState</span>({
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">success</span><span style="color:#f92672">:</span> (<span style="color:#a6e22e">res</span>) =&gt; {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#e6db74">&#39;获取本机蓝牙适配器状态。&#39;</span>, <span style="color:#a6e22e">JSON</span>.<span style="color:#a6e22e">stringify</span>(<span style="color:#a6e22e">res</span>))
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">discovering</span>) {
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">onBluetoothDeviceFound</span>()
</span></span><span style="display:flex;"><span>            } <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">available</span>) {
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">startBluetoothDevicesDiscovery</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">fail</span><span style="color:#f92672">:</span> (<span style="color:#a6e22e">res</span>) =&gt; {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#e6db74">&#39;error:获取本机蓝牙适配器状态失败&#39;</span>, <span style="color:#a6e22e">JSON</span>.<span style="color:#a6e22e">stringify</span>(<span style="color:#a6e22e">res</span>))
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">setTimeout</span>(() =&gt; {
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">getBluetoothAdapterState</span>()
</span></span><span style="display:flex;"><span>            }, <span style="color:#ae81ff">500</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></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">startBluetoothDevicesDiscovery</span>() {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">discoveryStarted</span>);
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (<span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">discoveryStarted</span>) {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</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:#e6db74">&#39;开始搜索蓝牙设备&#39;</span>);
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">discoveryStarted</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">onBluetoothDeviceFound</span>()
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">setTimeout</span>(() =&gt; {
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">uni</span>.<span style="color:#a6e22e">startBluetoothDevicesDiscovery</span>({
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">allowDuplicatesKey</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">true</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">success</span><span style="color:#f92672">:</span> (<span style="color:#a6e22e">res</span>) =&gt; {
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#e6db74">&#39;startBluetoothDevicesDiscovery success&#39;</span>, <span style="color:#a6e22e">JSON</span>.<span style="color:#a6e22e">stringify</span>(
</span></span><span style="display:flex;"><span>                    <span style="color:#a6e22e">res</span>))
</span></span><span style="display:flex;"><span>            },
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">fail</span><span style="color:#f92672">:</span> (<span style="color:#a6e22e">res</span>) =&gt; {
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">errCode</span> <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;10001&#39;</span>) {
</span></span><span style="display:flex;"><span>                    <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">alert</span>(<span style="color:#e6db74">&#39;当前蓝牙适配器不可用&#39;</span>)
</span></span><span style="display:flex;"><span>                } <span style="color:#66d9ef">else</span> {
</span></span><span style="display:flex;"><span>                    <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">alert</span>(<span style="color:#e6db74">&#39;搜索蓝牙失败,状态码：&#39;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">errCode</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:#ae81ff">500</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">stopBluetoothDevicesDiscovery</span>() {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">uni</span>.<span style="color:#a6e22e">stopBluetoothDevicesDiscovery</span>()
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">discoveryStarted</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 style="color:#75715e">//寻找到新设备的事件的回调函数
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">onBluetoothDeviceFound</span>() {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#e6db74">&#39;寻找到新设备的事件的回调函数&#39;</span>);
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">uni</span>.<span style="color:#a6e22e">onBluetoothDeviceFound</span>((<span style="color:#a6e22e">res</span>) =&gt; {
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#a6e22e">res</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">devices</span>.<span style="color:#a6e22e">forEach</span>(<span style="color:#a6e22e">device</span> =&gt; {
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span><span style="color:#a6e22e">device</span>.<span style="color:#a6e22e">name</span> <span style="color:#f92672">&amp;&amp;</span> <span style="color:#f92672">!</span><span style="color:#a6e22e">device</span>.<span style="color:#a6e22e">localName</span>) {
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">return</span>
</span></span><span style="display:flex;"><span>            }
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">foundDevices</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">devices</span>
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">idx</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">inArray</span>(<span style="color:#a6e22e">foundDevices</span>, <span style="color:#e6db74">&#39;deviceId&#39;</span>, <span style="color:#a6e22e">device</span>.<span style="color:#a6e22e">deviceId</span>)
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">idx</span> <span style="color:#f92672">===</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) {
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">devices</span>.<span style="color:#a6e22e">push</span>(<span style="color:#a6e22e">device</span>)
</span></span><span style="display:flex;"><span>            } <span style="color:#66d9ef">else</span> {
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">devices</span>[<span style="color:#a6e22e">idx</span>] <span style="color:#f92672">=</span> <span style="color:#a6e22e">device</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></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">createBLEConnection</span>(<span style="color:#a6e22e">e</span>) {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">uni</span>.<span style="color:#a6e22e">showLoading</span>({
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">title</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;设备连接中&#39;</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">mask</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">true</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">const</span> <span style="color:#a6e22e">ds</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">e</span>.<span style="color:#a6e22e">currentTarget</span>.<span style="color:#a6e22e">dataset</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">deviceId</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">ds</span>.<span style="color:#a6e22e">deviceId</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">name</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">ds</span>.<span style="color:#a6e22e">name</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">sysinfo</span>.<span style="color:#a6e22e">provider</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">1</span>) {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">ds</span>.<span style="color:#a6e22e">pair</span> <span style="color:#f92672">!==</span> <span style="color:#66d9ef">true</span>) {
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">android_search</span>(<span style="color:#a6e22e">deviceId</span>)
</span></span><span style="display:flex;"><span>        } <span style="color:#66d9ef">else</span> {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#e6db74">&#39;已配对&#39;</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">var</span> <span style="color:#a6e22e">device</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">null</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">BAdapter</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">null</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">BluetoothAdapter</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">null</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">uuid</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">null</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">main</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">null</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">bluetoothSocket</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">null</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">mac_address</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">deviceId</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">main</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">plus</span>.<span style="color:#a6e22e">android</span>.<span style="color:#a6e22e">runtimeMainActivity</span>();
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">BluetoothAdapter</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">plus</span>.<span style="color:#a6e22e">android</span>.<span style="color:#a6e22e">importClass</span>(<span style="color:#e6db74">&#34;android.bluetooth.BluetoothAdapter&#34;</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">UUID</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">plus</span>.<span style="color:#a6e22e">android</span>.<span style="color:#a6e22e">importClass</span>(<span style="color:#e6db74">&#34;java.util.UUID&#34;</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">uuid</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">UUID</span>.<span style="color:#a6e22e">fromString</span>(<span style="color:#e6db74">&#34;00001101-0000-1000-8000-00805F9B34FB&#34;</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">BAdapter</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">BluetoothAdapter</span>.<span style="color:#a6e22e">getDefaultAdapter</span>();
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">device</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">BAdapter</span>.<span style="color:#a6e22e">getRemoteDevice</span>(<span style="color:#a6e22e">mac_address</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">plus</span>.<span style="color:#a6e22e">android</span>.<span style="color:#a6e22e">importClass</span>(<span style="color:#a6e22e">device</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">bluetoothSocket</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">device</span>.<span style="color:#a6e22e">createInsecureRfcommSocketToServiceRecord</span>(<span style="color:#a6e22e">uuid</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">plus</span>.<span style="color:#a6e22e">android</span>.<span style="color:#a6e22e">importClass</span>(<span style="color:#a6e22e">bluetoothSocket</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">bluetoothSocket</span>.<span style="color:#a6e22e">isConnected</span>()) {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#e6db74">&#39;检测到设备未连接，尝试连接....&#39;</span>);
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">bluetoothSocket</span>.<span style="color:#a6e22e">connect</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">this</span>.<span style="color:#a6e22e">connected</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">name</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">name</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">deviceId</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">deviceId</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">canWrite</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">global_printing</span> <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">name</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">name</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">deviceId</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">deviceId</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">app</span>.<span style="color:#a6e22e">saveData1</span>(<span style="color:#e6db74">&#39;global_printing&#39;</span>, <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">global_printing</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">uni</span>.<span style="color:#a6e22e">hideLoading</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 style="color:#a6e22e">uni</span>.<span style="color:#a6e22e">createBLEConnection</span>({
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">deviceId</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">success</span><span style="color:#f92672">:</span> (<span style="color:#a6e22e">res</span>) =&gt; {
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">connected</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">name</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">name</span>
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">deviceId</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">deviceId</span>
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">global_printing</span> <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">name</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">name</span>,
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">deviceId</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">deviceId</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">onBLEConnectionStateChange</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">setTimeout</span>(() =&gt; {
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">getBLEDeviceServices</span>(<span style="color:#a6e22e">deviceId</span>)
</span></span><span style="display:flex;"><span>            }, <span style="color:#ae81ff">1000</span>)
</span></span><span style="display:flex;"><span>        },
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">fail</span><span style="color:#f92672">:</span> (<span style="color:#a6e22e">res</span>) =&gt; {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">uni</span>.<span style="color:#a6e22e">hideLoading</span>();
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">Toast</span>(<span style="color:#e6db74">&#39;设备连接失败&#39;</span>)
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#e6db74">&#34;蓝牙连接失败:&#34;</span>, <span style="color:#a6e22e">res</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">this</span>.<span style="color:#a6e22e">stopBluetoothDevicesDiscovery</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">//获取蓝牙设备所有服务(service)
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">getBLEDeviceServices</span>(<span style="color:#a6e22e">deviceId</span>) {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">uni</span>.<span style="color:#a6e22e">getBLEDeviceServices</span>({
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">deviceId</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">success</span><span style="color:#f92672">:</span> (<span style="color:#a6e22e">res</span>) =&gt; {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#e6db74">&#34;获取蓝牙服务成功：&#34;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">JSON</span>.<span style="color:#a6e22e">stringify</span>(<span style="color:#a6e22e">res</span>))
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">services</span>.<span style="color:#a6e22e">length</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>) {
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">uni</span>.<span style="color:#a6e22e">hideLoading</span>();
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">alert</span>(<span style="color:#e6db74">&#39;没有获取到蓝牙服务，无法打印001&#39;</span>)
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">global_printing</span> <span style="color:#f92672">=</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">for</span> (<span style="color:#66d9ef">let</span> <span style="color:#a6e22e">i</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; <span style="color:#a6e22e">i</span> <span style="color:#f92672">&lt;</span> <span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">services</span>.<span style="color:#a6e22e">length</span>; <span style="color:#a6e22e">i</span><span style="color:#f92672">++</span>) {
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">services</span>[<span style="color:#a6e22e">i</span>].<span style="color:#a6e22e">isPrimary</span>) {
</span></span><span style="display:flex;"><span>                    <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">getBLEDeviceCharacteristics</span>(<span style="color:#a6e22e">deviceId</span>, <span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">services</span>[<span style="color:#a6e22e">i</span>].<span style="color:#a6e22e">uuid</span>)
</span></span><span style="display:flex;"><span>                    <span style="color:#66d9ef">return</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">fail</span><span style="color:#f92672">:</span> (<span style="color:#a6e22e">res</span>) =&gt; {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">setTimeout</span>(() =&gt; {
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">getBLEDeviceServices</span>(<span style="color:#a6e22e">deviceId</span>)
</span></span><span style="display:flex;"><span>            }, <span style="color:#ae81ff">500</span>)
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#e6db74">&#34;获取蓝牙服务失败：&#34;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">JSON</span>.<span style="color:#a6e22e">stringify</span>(<span style="color:#a6e22e">res</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></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">//获取蓝牙设备某个服务中所有特征值(characteristic)
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">getBLEDeviceCharacteristics</span>(<span style="color:#a6e22e">deviceId</span>, <span style="color:#a6e22e">serviceId</span>) {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#e6db74">&#39;获取蓝牙设备某个服务中所有特征值&#39;</span>, <span style="color:#a6e22e">deviceId</span>, <span style="color:#a6e22e">serviceId</span>)
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">uni</span>.<span style="color:#a6e22e">getBLEDeviceCharacteristics</span>({
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">deviceId</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">serviceId</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">success</span><span style="color:#f92672">:</span> (<span style="color:#a6e22e">res</span>) =&gt; {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#e6db74">&#39;获取蓝牙设备某个服务中所有特征值 success&#39;</span>, <span style="color:#a6e22e">JSON</span>.<span style="color:#a6e22e">stringify</span>(<span style="color:#a6e22e">res</span>))
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">uni</span>.<span style="color:#a6e22e">hideLoading</span>();
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">characteristics</span>.<span style="color:#a6e22e">length</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">0</span>) {
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">alert</span>(<span style="color:#e6db74">&#39;没有获取到蓝牙服务，无法打印002&#39;</span>)
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">global_printing</span> <span style="color:#f92672">=</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">for</span> (<span style="color:#66d9ef">let</span> <span style="color:#a6e22e">i</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; <span style="color:#a6e22e">i</span> <span style="color:#f92672">&lt;</span> <span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">characteristics</span>.<span style="color:#a6e22e">length</span>; <span style="color:#a6e22e">i</span><span style="color:#f92672">++</span>) {
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">let</span> <span style="color:#a6e22e">item</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">characteristics</span>[<span style="color:#a6e22e">i</span>]
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">properties</span>.<span style="color:#a6e22e">read</span>) {
</span></span><span style="display:flex;"><span>                    <span style="color:#a6e22e">uni</span>.<span style="color:#a6e22e">readBLECharacteristicValue</span>({
</span></span><span style="display:flex;"><span>                        <span style="color:#a6e22e">deviceId</span>,
</span></span><span style="display:flex;"><span>                        <span style="color:#a6e22e">serviceId</span>,
</span></span><span style="display:flex;"><span>                        <span style="color:#a6e22e">characteristicId</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">uuid</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">if</span> (<span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">properties</span>.<span style="color:#a6e22e">write</span>) {
</span></span><span style="display:flex;"><span>                    <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">canWrite</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span>                    <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">global_printing</span>.<span style="color:#a6e22e">_deviceId</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">deviceId</span>
</span></span><span style="display:flex;"><span>                    <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">global_printing</span>.<span style="color:#a6e22e">_serviceId</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">serviceId</span>
</span></span><span style="display:flex;"><span>                    <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">global_printing</span>.<span style="color:#a6e22e">_characteristicId</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">uuid</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>                    <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">saveData1</span>(<span style="color:#e6db74">&#39;global_printing&#39;</span>, <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">global_printing</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>                    <span style="color:#75715e">//this.writeBLECharacteristicValue()
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>                }
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">properties</span>.<span style="color:#a6e22e">notify</span> <span style="color:#f92672">||</span> <span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">properties</span>.<span style="color:#a6e22e">indicate</span>) {
</span></span><span style="display:flex;"><span>                    <span style="color:#a6e22e">uni</span>.<span style="color:#a6e22e">notifyBLECharacteristicValueChange</span>({
</span></span><span style="display:flex;"><span>                        <span style="color:#a6e22e">deviceId</span>,
</span></span><span style="display:flex;"><span>                        <span style="color:#a6e22e">serviceId</span>,
</span></span><span style="display:flex;"><span>                        <span style="color:#a6e22e">characteristicId</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">item</span>.<span style="color:#a6e22e">uuid</span>,
</span></span><span style="display:flex;"><span>                        <span style="color:#a6e22e">state</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">true</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></span><span style="display:flex;"><span>        <span style="color:#a6e22e">fail</span>(<span style="color:#a6e22e">res</span>) {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">error</span>(<span style="color:#e6db74">&#39;获取特征值失败：&#39;</span>, <span style="color:#a6e22e">res</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">uni</span>.<span style="color:#a6e22e">onBLECharacteristicValueChange</span>((<span style="color:#a6e22e">characteristic</span>) =&gt; {
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">data</span>.<span style="color:#a6e22e">chs</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">idx</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">inArray</span>(<span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">data</span>.<span style="color:#a6e22e">chs</span>, <span style="color:#e6db74">&#39;uuid&#39;</span>, <span style="color:#a6e22e">characteristic</span>.<span style="color:#a6e22e">characteristicId</span>)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">data</span> <span style="color:#f92672">=</span> {}
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">idx</span> <span style="color:#f92672">===</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>) {
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">chs</span>[<span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">data</span>.<span style="color:#a6e22e">chs</span>.<span style="color:#a6e22e">length</span>] <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">uuid</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">characteristic</span>.<span style="color:#a6e22e">characteristicId</span>,
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">value</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">ab2hex</span>(<span style="color:#a6e22e">characteristic</span>.<span style="color:#a6e22e">value</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>            <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">chs</span>[<span style="color:#a6e22e">idx</span>] <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">uuid</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">characteristic</span>.<span style="color:#a6e22e">characteristicId</span>,
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">value</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">ab2hex</span>(<span style="color:#a6e22e">characteristic</span>.<span style="color:#a6e22e">value</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></span><span style="display:flex;"><span>},
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">onBLEConnectionStateChange</span>() {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">uni</span>.<span style="color:#a6e22e">onBLEConnectionStateChange</span>((<span style="color:#a6e22e">res</span>) =&gt; {
</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">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#e6db74">`蓝牙连接状态改变device </span><span style="color:#e6db74">${</span><span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">deviceId</span><span style="color:#e6db74">}</span><span style="color:#e6db74"> state has changed, connected: </span><span style="color:#e6db74">${</span><span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">connected</span><span style="color:#e6db74">}</span><span style="color:#e6db74">`</span>)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">res</span>.<span style="color:#a6e22e">connected</span> <span style="color:#f92672">==</span> <span style="color:#66d9ef">false</span>) {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">global_printing</span> <span style="color:#f92672">=</span> {}
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">connected</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">chs</span> <span style="color:#f92672">=</span> []
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">canWrite</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></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">closeBLEConnection</span>() {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">global_printing</span> <span style="color:#f92672">=</span> {}
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">uni</span>.<span style="color:#a6e22e">closeBLEConnection</span>({
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">deviceId</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">deviceId</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">connected</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">chs</span> <span style="color:#f92672">=</span> []
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">canWrite</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 style="color:#75715e">//关闭蓝牙模块
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">closeBluetoothAdapter</span>() {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">global_printing</span> <span style="color:#f92672">=</span> {}
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">uni</span>.<span style="color:#a6e22e">closeBluetoothAdapter</span>()
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">discoveryStarted</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 style="color:#75715e">//发送数据
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">sendStr</span>(<span style="color:#a6e22e">bufferstr</span>, <span style="color:#a6e22e">success</span>, <span style="color:#a6e22e">fail</span>) {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">that</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">this</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">uni</span>.<span style="color:#a6e22e">writeBLECharacteristicValue</span>({
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">deviceId</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">global_printing</span>.<span style="color:#a6e22e">_deviceId</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">serviceId</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">global_printing</span>.<span style="color:#a6e22e">_serviceId</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">characteristicId</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">global_printing</span>.<span style="color:#a6e22e">_characteristicId</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">value</span><span style="color:#f92672">:</span> <span style="color:#a6e22e">bufferstr</span>,
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">success</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">res</span>) {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">success</span>(<span style="color:#a6e22e">res</span>);
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#e6db74">&#39;发送的数据：&#39;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">bufferstr</span>)
</span></span><span style="display:flex;"><span>            <span style="color:#75715e">// console.log(&#39;message发送成功&#39;)
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>        },
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">fail</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">res</span>) {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">fail</span>(<span style="color:#a6e22e">res</span>)
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#e6db74">&#34;数据发送失败:&#34;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">JSON</span>.<span style="color:#a6e22e">stringify</span>(<span style="color:#a6e22e">res</span>))
</span></span><span style="display:flex;"><span>        },
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">complete</span><span style="color:#f92672">:</span> <span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">res</span>) {
</span></span><span style="display:flex;"><span>            <span style="color:#75715e">// console.log(&#34;发送完成:&#34; + JSON.stringify(res))
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></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></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">printCode</span>(<span style="color:#a6e22e">arr</span>) {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">that</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">this</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">arr</span>.<span style="color:#a6e22e">length</span> <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>) {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">sendStr</span>(<span style="color:#a6e22e">arr</span>[<span style="color:#ae81ff">0</span>], <span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">success</span>) {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">arr</span>.<span style="color:#a6e22e">shift</span>();
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">that</span>.<span style="color:#a6e22e">printCode</span>(<span style="color:#a6e22e">arr</span>);
</span></span><span style="display:flex;"><span>        }, <span style="color:#66d9ef">function</span>(<span style="color:#a6e22e">error</span>) {
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">alert</span>(<span style="color:#e6db74">&#39;打印失败，错误码：&#39;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">error</span>.<span style="color:#a6e22e">errCode</span>)
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">printing_status</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#a6e22e">error</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><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">setTimeout</span>(<span style="color:#66d9ef">function</span>() {
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">printing_status</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#e6db74">&#39;打印结束&#39;</span>);
</span></span><span style="display:flex;"><span>    }, <span style="color:#ae81ff">1000</span>);
</span></span><span style="display:flex;"><span>},
</span></span></code></pre></div><p><strong>Android</strong>
比較的シンプルで便利です。Native.jsを使用してNative Javaインターフェースチャネルを直接呼び出し、<code>plus.android</code>を介してAndroidネイティブシステムAPIを呼び出します。
ネイティブAndroidドキュメント <a href="https://developer.android.google.cn/reference/android/bluetooth/BluetoothAdapter?hl=en">https://developer.android.google.cn/reference/android/bluetooth/BluetoothAdapter?hl=en</a></p>
        
        <hr><p>この記事は2019-11-05に<a href='https://zh.moejue.cn/'>阿珏酱のBlog</a>で公開され、最終更新日は2019-11-05です</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>
    
    

    <item>
      <title>LinuxでのPHP環境のインストール</title>
      <link>https://zh.moejue.cn/ja/posts/65/</link>
      <pubDate>Mon, 07 May 2018 06:52:32 &#43;0000</pubDate>
      <author>xxx@example.com (MoeJue)</author>
      <guid>https://zh.moejue.cn/ja/posts/65/</guid>
      <description>
        <![CDATA[<h1>LinuxでのPHP環境のインストール</h1><p>著者: MoeJue(xxx@example.com)</p>
        
          <p>学习环境：Centos 7.2 正式版</p>
<p># 更新源
yumアップデート</p>
<h1 id="安装-nginx">
<a class="header-anchor" href="#%e5%ae%89%e8%a3%85-nginx"></a>
安装 nginx
</h1><p>yum install nginx -y</p>
<h1 id="安装mysql">
<a class="header-anchor" href="#%e5%ae%89%e8%a3%85mysql"></a>
安装mysql
</h1><p>wget <a href="https://repo.mysql.com//mysql57-community-release-el7-11.noarch.rpm">https://repo.mysql.com//mysql57-community-release-el7-11.noarch.rpm</a>
yum localinstall mysql57-community-release-el7-11.noarch.rpm</p>
<h1 id="安装php72">
<a class="header-anchor" href="#%e5%ae%89%e8%a3%85php72"></a>
安装PHP7.2
</h1><p>rpm -Uvh <a href="https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm">https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm</a>
rpm -Uvh <a href="https://mirror.webtatic.com/yum/el7/webtatic-release.rpm">https://mirror.webtatic.com/yum/el7/webtatic-release.rpm</a>
yumアップデート
yum install -y php72w-cli php72w-common php72w-dba php72w-devel php72w-fpm php72w-gd php72w-imap php72w-mbstring php72w-mysql php72w-pdo php72w-pdo_dblib php72w-pear php72w-pecl-igbinary php72w-pecl-xdebug php72w-process php72w-xml php72w-xmlrpc php72w-opcache php72w-pecl-memcached php72w-pecl-mongodb php72w-pecl-redis</p>
<h1 id="启动服务">
<a class="header-anchor" href="#%e5%90%af%e5%8a%a8%e6%9c%8d%e5%8a%a1"></a>
启动服务
</h1><p>サービス nginx スタート
サービス mysql 開始
php-fmp サービス開始
/usr/sbin/php-fpm &ndash;nodaemonize &ndash;fpm-config /etc/php-fpm.conf &gt; /dev/null 2&gt;&amp;1 &amp;</p>
<h1 id="编辑配置文件">
<a class="header-anchor" href="#%e7%bc%96%e8%be%91%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6"></a>
编辑配置文件
</h1><p>vim /etc/nginx/nginx.conf
:q!#不保存退出
wq #保存退出</p>
        
        <hr><p>この記事は2018-05-07に<a href='https://zh.moejue.cn/'>阿珏酱のBlog</a>で公開され、最終更新日は2018-05-07です</p>]]>
      </description>
      
        <category>教程</category>
      
    </item>
    
    

    <item>
      <title>.htaccessを利用してサブドメインをサブディレクトリに紐付ける</title>
      <link>https://zh.moejue.cn/ja/posts/58/</link>
      <pubDate>Mon, 22 Jan 2018 01:18:11 &#43;0000</pubDate>
      <author>xxx@example.com (MoeJue)</author>
      <guid>https://zh.moejue.cn/ja/posts/58/</guid>
      <description>
        <![CDATA[<h1>.htaccessを利用してサブドメインをサブディレクトリに紐付ける</h1><p>著者: MoeJue(xxx@example.com)</p>
        
          <p>通常、1つの仮想ホストでは、ルートディレクトリにバインドできるドメインは1つだけです。
emlogを使用したことがある方なら、その静的リンク（パーマリンク）についてよくご存知のはずです。これは、.htaccessファイルを利用してウェブページをドメインリダイレクトする典型的な例です。
.htaccessを利用してドメインをサブディレクトリにバインドするには、前提として、お使いのホスティングサーバーがApacheのrewrite機能をサポートしている必要があります。そうでなければ.htaccessは使用できません。もしお使いのサーバーがLinuxサーバーであれば、通常はデフォルトで有効になっています。これにより、ドメインのサブディレクトリへのバインドや、1つのホスティングスペースで複数のサイトを運営することが可能になります。</p>
<p>以下は、<code>link.52ecy.cn</code> をサブディレクトリ <code>link</code> にバインドする例の.htaccessコードです。</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-apache" data-lang="apache"><span style="display:flex;"><span><span style="color:#f92672">&lt;IfModule</span> <span style="color:#e6db74">mod_rewrite.c</span><span style="color:#f92672">&gt;</span>  
</span></span><span style="display:flex;"><span>RewriteEngine <span style="color:#66d9ef">On</span>  
</span></span><span style="display:flex;"><span>RewriteBase /  
</span></span><span style="display:flex;"><span><span style="color:#75715e"># link.52ecy.cn をサブディレクトリ link にバインド</span>
</span></span><span style="display:flex;"><span>RewriteCond %{HTTP_HOST} ^link\.52ecy\.cn$ [NC]  
</span></span><span style="display:flex;"><span>RewriteCond %{REQUEST_URI} !^/link/  
</span></span><span style="display:flex;"><span>RewriteRule ^(.*)$ link/$1?Rewrite [L,QSA]  
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 複数バインド可能。上の3行を繰り返し、ドメイン名とディレクトリ名を変更するだけです</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">&lt;/IfModule&gt;</span> 
</span></span></code></pre></div><p>上記の手順を完了すると、サブドメインにアクセスできるようになるはずです。しかし、ブラウザで「メインドメイン + バインドしたディレクトリ」にアクセスしても表示されることに気づくでしょう。これは我々が望む動作ではありません。
次に、最後のステップを完了させます。バインドした各ディレクトリ（例えば<code>link</code>ディレクトリ）にも、.htaccessファイルを追加します。
.htaccessのコードは以下の通りです。</p>
<p>以下は、<code>music.xmgho.com</code> をサブディレクトリ <code>music</code> にバインドする例の.htaccessコードです。
これにより、ドメインのサブディレクトリへのバインドや、1つのホスティングスペースで複数のサイトを運営することが可能になります。これにより、ドメインのサブディレクトリへのバインドや、1つのホスティングスペースで複数のサイトを運営することが可能になります。これにより、ドメインのサブディレクトリへのバインドや、1つのホスティングスペースで複数のサイトを運営することが可能になります。これにより、ドメインのサブディレクトリへのバインドや、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-apache" data-lang="apache"><span style="display:flex;"><span><span style="color:#f92672">&lt;IfModule</span> <span style="color:#e6db74">mod_rewrite.c</span><span style="color:#f92672">&gt;</span>  
</span></span><span style="display:flex;"><span>RewriteEngine <span style="color:#66d9ef">On</span>  
</span></span><span style="display:flex;"><span>RewriteBase /  
</span></span><span style="display:flex;"><span><span style="color:#75715e"># バインドしたドメインからのアクセスのみを許可</span>
</span></span><span style="display:flex;"><span>RewriteCond %{HTTP_HOST} !^link\.52ecy\.cn$ [NC]  
</span></span><span style="display:flex;"><span>RewriteRule (.*) http://link.52ecy.cn/$1 [L,R=301]  
</span></span><span style="display:flex;"><span><span style="color:#75715e"># バインドしたディレクトリ内の同名ディレクトリの処理</span>
</span></span><span style="display:flex;"><span>RewriteCond %{REQUEST_URI} ^\<span style="color:#e6db74">/link</span>\/ [NC]  
</span></span><span style="display:flex;"><span>RewriteCond %{QUERY_STRING} !^(.*)?Rewrite  
</span></span><span style="display:flex;"><span>RewriteRule ^(.*)$ /%{REQUEST_URI}/%{REQUEST_URI}/$1?Rewrite [L,QSA]  
</span></span><span style="display:flex;"><span><span style="color:#f92672">&lt;/IfModule&gt;</span> 
</span></span></code></pre></div><p>結び：
私のサーバー自体がサブドメインのサブディレクトリへのバインドをサポートしているため、自分ではテストできませんでした。しかし、友人にAlibaba Cloud（阿里云）のホストでテストしてもらったところ、成功しました。ただし、Alibaba Cloudには数量制限があり、多数バインドするとルートディレクトリにリダイレクトされるようです。このことから、すべてのホスティングプロバイダーがこの方法をサポートしているわけではないようで、ご自身でテストして確認する必要があります。
最後に、最も重要な点は、ドメインが正しく名前解決されていなければ意味がないということです[苦笑～]</p>
        
        <hr><p>この記事は2018-01-22に<a href='https://zh.moejue.cn/'>阿珏酱のBlog</a>で公開され、最終更新日は2018-01-22です</p>]]>
      </description>
      
        <category>折腾代码</category>
      
    </item>
    
  </channel>
</rss>
