[メモ] Git よく使うコマンド大全(シーン別)

日常の開発でよく使われるGitの操作をまとめたものです。カテゴリ別に整理されているため、すぐに使い始めたい方や、コマンドを確認したい時に役立ちます。 📦 基本コマンド コマンド 役割 git init Gitリポジトリを初期化します(.gitフォルダを作成)。 git clone <url> リモートリポジトリをローカルにクローンします。 git status 現在のワーキングディレクトリの状態(ファイルの変更、ステージングなど)を確認します。 git add <file> ファイルをステージングエリアに追加します。 git commit -m "message" ステージングエリアのファイルをローカルリポジトリにコミットし、コミットメッセージを追加します。 git log コミット履歴を表示します。 🌱 ブランチ管理 コマンド 役割 git branch ローカルブランチの一覧を表示します。 git branch <branch-name> 新しいブランチを作成します。 git checkout <branch-name> 指定したブランチに切り替えます。 git switch <branch-name> 指定したブランチに切り替えます(推奨される新しいコマンド)。 git merge <branch-name> 指定したブランチを現在のブランチにマージします。 git branch -d <branch-name> マージ済みのブランチを削除します。 git branch -D <branch-name> ブランチを強制的に削除します。 🌍 リモートリポジトリ操作 コマンド 役割 git remote -v リモートリポジトリのURLを表示します。 git remote add <name> <url> ...

2025年6月2日 · 2 分 · MoeJue

敗者復活戦に勝って、生き返った

近況 前回の雑談からもう2ヶ月以上も経ってしまいました。そろそろ自分の考えを整理する時が来たようです。前回は色々と感慨を述べたきり音沙汰がなかったので、少し急ぎすぎたかもしれません。その後の作業が追いつかなくなってしまいました。 また国慶節の季節がやってきました。やはり私の国慶節は「独身の日(ダブルイレブン)」のようなものです。以前所有していた3つのドメイン(52ecy.cn, moeins.cn, moeins.com)は、復活戦には勝ったものの、装備がなくなってしまいました。 そのため、ドメインを新規購入するしかありませんでした。同時にもブログを復旧させました。やはり自分でいじりたいのでしょう。博客园(cnblogs)に間借りするのは、どうも居心地が悪く感じます。 以前からずっと使っていたemlogですが、この機会に思い切ってシステムをWordPressに移行し、同時に新しいテーマに切り替えました。このテーマは专收爆米花さんが21年頃にリリースしたもので、当時locで見かけてすぐにstarを付け、私のGitHubで4年間眠っていましたlolimeow。当時はずっとemlogを使っていたので、いじるのが面倒だったのです。この機会に乗じて、徹底的にやろうと決め、データの移行やテーマの調整など、かなりの手間をかけました。 作者の方がずっとテーマの更新を積極的に進めてくれていたおかげで、使用中に大きな問題はありませんでした。しかし、私が以前使っていたシステムの機能がいくつか欠けていたので、私もこのテーマを更新し、元のリポジトリにプルリクエストを送りました。上に貼ったGitHubのリンクは私が更新した後のものです。 最も面倒だったデータ移行の部分ですが、ネットで長いこと探し回ってもexe版しか見つかりませんでした。exe版はなんとなく不安な感じがする上に、私は今Macを使っているので、直接実行することもできません。「ないなら自分で作ればいい」ということで、時間をかけて移行スクリプトを自作するしかありませんでした。GitHubのアドレスは記事の最後に載せてあります。emlogのデータをWordPressに完璧に移行できます。さすが俺! 画像はこれまで通り、一部はバックアップとして七牛云(Qiniu Cloud)に、もう一部は新浪图床(Sina Image Hosting)に保存しています。移行してみると、市場には私に適した使いやすい七牛云プラグインがなかったので、また自分で一つ作りました。 新ドメイン あまり気は進みませんでしたが、またドメインを変更するしかありませんでした。以前のドメインは他人の肥やしになってしまいました。萌音シリーズ:MoeKot.cn。「萌音ノート」「萌音カード」「萌音コミュニティ」「萌音ストア」などを含む萌音シリーズは、今後このドメインの下に置かれます。メインサイトシリーズ:MoeJue.cn。これは私のメインサイトで、ブログやシリーズに属さないプロジェクトなどがこのドメインの下に置かれます。 解説 Moe: 日本語の「萌え」の読み方で、ローマ字表記です。中国語では一般的に「萌」と訳されます。 Kot: 日本語の「声(こえ)」を意味する言葉で、ローマ字表記です。 Jue: 阿珏(A Jue)ちゃんの簡単な音訳です。 ブログ 私はとても昔を懐かしむ情に厚い人間なので、以前のブログもすべて残してあります。Xlog cnblogs emlog Blog 関連サイトのドメインも移行しましたが、すべてをリストアップするのはやめておきます。もちろん、一部のリンクが完全に置換されていない可能性もあります。 すべてのデータは元のままで、誰一人のデータも欠けていません。ブログの登録ユーザーのデータさえも一緒に移行したので、新しいシステムで直接ログインできます。パスワードも同じです。 ぜひstarを付けてください! 使い方もREADME.mdに書いておきました。何か問題があれば、直接issueを立ててください。 emlogからWordPressへの移行スクリプト 私のブログは間もなくTencent Cloud開発者コミュニティにも同期される予定です。皆さんのご参加をお待ちしています:https://cloud.tencent.com/developer/support-plan?invite_code=15kxzzid10tgx

2024年10月3日 · 1 分 · MoeJue

Web3.0とは何か?ブロックチェーンとの関係は?

また一つ、よくわからない言葉が出てきましたね-_-。以下に要点をまとめてみました。 web3.0とは何か Web 3.0(Web3)は、次世代のインターネットの発展方向であり、より分散化され、ユーザーがコントロールし、データが保護されるネットワーク環境を構築することを目指しています。これまでのWeb 1.0(静的なウェブページ)やWeb 2.0(動的でインタラクティブなウェブページやソーシャルメディア)とは異なり、Web 3.0の核心的な理念と技術には以下の側面が含まれます。 非中央集権化: ブロックチェーン技術:Web 3.0の核心はブロックチェーン技術であり、すべての取引やデータの変更を記録する分散型台帳を提供します。これは、データが単一の中央サーバーによって管理されるのではなく、複数のノードに分散されることを意味します。 分散型アプリケーション(DApps):これらのアプリケーションはブロックチェーンネットワーク上で実行され、中央集権的な管理者が存在しません。DAppsのユーザーは、仲介機関を介さずに直接取引や対話を行うことができます。 ユーザーコントロールとデータ保護: 自己主権型アイデンティティ:Web 3.0では、ユーザーは自身のデジタルアイデンティティとデータを完全にコントロールできます。暗号技術を通じて、ユーザーは誰が自分のデータにアクセスできるか、またそのデータをどのように使用するかを決定できます。 データ所有権:ユーザーのデータは分散型ネットワーク上に保存され、大手企業による集中管理ではなく、ユーザー自身がデータの所有権を持ちます。 スマートコントラクト: 自動実行プロトコル:スマートコントラクトは、ブロックチェーン上で実行される自動化されたプロトコルであり、特定の条件が満たされると自動的に実行されます。この技術は、金融取引、サプライチェーン管理、法的な契約など、さまざまなシーンで利用できます。 相互運用性:Web 3.0は、異なるブロックチェーンや分散型ネットワーク間の相互運用性を実現し、データや資産が異なるプラットフォーム間でシームレスに移動できるようにすることを目指しています。 トラストレスと透明性: トラストレスなメカニズム:Web 3.0はブロックチェーン技術を通じてトラストレスなメカニズムを実現します。つまり、参加者はお互いを信頼したり、第三者の仲介者に依存したりすることなく、安全な取引や対話を行うことができます。 透明性:すべての取引やデータの変更はブロックチェーン上に記録され、公開され透明であり、改ざん不可能です。これにより、信頼性とセキュリティが向上します。 Web 3.0の応用シーン 分散型金融(DeFi):スマートコントラクトとブロックチェーン技術を通じて、貸付、取引、投資などの仲介者を必要としない金融サービスを提供します。 デジタルアイデンティティ:ユーザーは自身のデジタルアイデンティティを作成・管理し、個人データのアクセスと使用をコントロールできます。 サプライチェーン管理:ブロックチェーン技術を通じて、サプライチェーンの透明性と追跡可能性を実現し、偽造や詐欺を防止します。 コンテンツ制作と配信:アーティスト、ミュージシャン、作家は、直接視聴者と対話し取引を行うことで、より公平な収益分配を得ることができます。 では、ブロックチェーンとは何か? ブロックチェーン技術は、分散型台帳技術(Distributed Ledger Technology, DLT)の一種であり、取引や情報を記録するための改ざん不可能で非中央集権的なデータベースです。ブロックチェーン技術の核心的な考え方は、非中央集権的な方法でデータの安全性、透明性、信頼性を実現することです。 ブロックチェーンの基本原理 ブロック(Block): ブロックは取引記録を含むデータパッケージです。各ブロックには複数の取引と、そのブロックを一位に識別するためのハッシュ値が含まれています。 ブロックには前のブロックのハッシュ値も含まれており、これによりすべてのブロックが鎖のようにつながり、ブロックチェーンを形成します。 チェーン(Chain): ブロックはハッシュ値によって相互に連結され、チェーン構造を形成します。各ブロックが前のブロックのハッシュ値を含むため、ブロックチェーン内のデータを改ざんすることは非常に困難です。 あるブロックのデータを変更しようとすると、そのブロックおよびそれに続くすべてのブロックのハッシュ値が変化するため、これらすべてのブロックのハッシュ値を再計算する必要があり、これはほぼ不可能です。 非中央集権化(Decentralization): ブロックチェーンネットワーク内のすべてのノード(コンピュータ)は、ブロックチェーンの完全なコピーを保持しており、これらのコピーはコンセンサスメカニズムによって一貫性が保たれています。 中央機関がブロックチェーンを管理・制御することはなく、データはすべてのノードによって共同で維持されます。 コンセンサスメカニズム(Consensus Mechanism): ブロックチェーンネットワークは、すべてのノードがブロックチェーンの状態について合意に達することを保証するためにコンセンサスメカニズムを使用します。一般的なコンセンサスメカニズムには、プルーフ・オブ・ワーク(Proof of Work, PoW)やプルーフ・オブ・ステーク(Proof of Stake, PoS)があります。 プルーフ・オブ・ワーク(PoW):マイナーが複雑な数学的問題を解くことで取引を検証し、ブロックチェーンに追加します。問題を解くには大量の計算能力が必要であり、これによりブロックチェーンのセキュリティが確保されます。 プルーフ・オブ・ステーク(PoS):バリデーターが保有する暗号資産の量やその他の要因に基づいて取引を検証し、それに応じた報酬を得ます。 暗号技術(Cryptography): ブロックチェーンは、データの安全性とプライバシーを確保するために暗号技術を使用します。各取引は公開鍵と秘密鍵を使用して署名・検証され、正当な所有者のみが取引を開始できるようにします。 ブロックチェーンのメリット セキュリティ: データは複数のノードに分散されているため、単一障害点がなく、攻撃者がデータを改ざんすることは困難です。各ブロックには前のブロックのハッシュ値が含まれており、一つのブロックを改ざんするにはチェーン全体を変更する必要があるため、コストが非常に高くなります。 透明性: ブロックチェーン上のすべての取引記録は公開されており、誰でも閲覧できます。取引記録は改ざん不可能であり、システムの透明性と信頼性を高めます。 非中央集権化: 中央管理機関が存在せず、すべてのノードが平等にネットワークの維持・管理に参加するため、単一の支配や権力の集中を防ぎます。 改ざん耐性: データが一度ブロックチェーンに書き込まれると、それを改ざんすることは非常に困難であり、データの完全性と真正性が保証されます。 ブロックチェーンの応用シーン 暗号資産(仮想通貨): ビットコイン(Bitcoin)は、最初で最も有名なブロックチェーンアプリケーションであり、非中央集権的な方法でピアツーピアの電子現金システムを実現します。 イーサリアム(Ethereum)は、暗号資産の取引だけでなく、スマートコントラクトの実行もサポートしており、ブロックチェーンの応用範囲を広げています。 サプライチェーン管理: ...

2024年6月17日 · 1 分 · MoeJue

Web3.0ベースのブロックチェーン画像アップロード

始める前に、まず基本的な概念を簡単に理解しましょう。以下のいくつかの点にまとめました。Web3.0とは何か、ブロックチェーンとどのような関係があるのか?(前回の記事がここで役立ちますね) 要件:PythonベースのWeb 3.0画像アップロードシステムを開発します。このシステムは、ユーザーが画像をアップロードし、その画像を分散型ネットワークに保存し、同時にトランザクション情報をブロックチェーンに記録することを可能にします。もともとは遊びで書いていたもので、ユーザー認証やファイル操作を統合した完全な管理システムにして、「画像アップロードサービスの最終的な解決策」にしようと考えたこともありましたが、実際にやってみるとあまり現実的ではないことに気づき、断念しました。しかし、私は昔から画像にこだわりがあるのです。 ステップの概要 環境設定:Pythonを使用して開発し、必要なPythonライブラリをインストールします。 IPFS統合:画像をIPFSにアップロードし、画像のCID(Content Identifier)を取得します。 ブロックチェーン統合:IPFSのCIDをブロックチェーンに記録します。 Webインターフェース:Flaskを使用して、ユーザーが画像をアップロードできるWebインターフェースを作成します。 詳細なステップ 1. 環境設定 必要なPythonライブラリをインストールします: pip install flask web3 ipfshttpclient 2. IPFS統合 IPFS(InterPlanetary File System)は、ピアツーピアのファイルストレージプロトコルです。ipfshttpclientライブラリを使用してIPFSネットワークと対話できます。 まず、IPFSノードをインストールして実行していることを確認してください。まだIPFSをインストールしていない場合は、IPFS公式サイトでインストールガイドを見つけることができます。 以下は、画像をIPFSにアップロードするコード例です: import ipfshttpclient def upload_to_ipfs(file_path): client = ipfshttpclient.connect('/ip4/127.0.0.1/tcp/5001') res = client.add(file_path) return res['Hash'] 3. ブロックチェーン統合 web3.pyライブラリを使用してIPFSのCIDをブロックチェーンに記録します。ここではイーサリアム(Ethereum)をサンプルブロックチェーンとして使用します。 以下は、IPFSのCIDを保存するための簡単なスマートコントラクトの例です: pragma solidity ^0.8.0; contract IPFSStorage { mapping(address => string[]) public userCIDs; function storeCID(string memory cid) public { userCIDs[msg.sender].push(cid); } function getCIDs() public view returns (string[] memory) { return userCIDs[msg.sender]; } } このコントラクトをコンパイルしてデプロイした後、以下のPythonコードを使用してスマートコントラクトと対話します: ...

2024年6月17日 · 2 分 · MoeJue

Android APK インストール パッケージの AndroidManifest.xml ファイルを表示します。

原因 先週、私は Android システムのファクトリープッシュ機能に取り組んでいました。一部のモデルは工場出荷時にオフラインにプッシュできないため、apk を解凍し、パッケージ化パラメータに問題があるかどうかを確認します。 序文 Android 開発では、自分のアプリケーションから他のアプリケーションのインターフェイスにジャンプする必要がある場合がありますが、他のアプリケーションのパッケージ名とクラス名が分からないと、これを行うのは困難です。最も簡単な方法は、アプリケーションの apk ファイルをダウンロードし、拡張子を zip または rar に変更して、ファイルを解凍することです。解凍したファイルの中に AndroidManifest.xml ファイルがあるのですが、開いてみると文字化けしていて恥ずかしいです。どうすればいいですか? AXMLPrinter2.jar は、一般的に使用される APK 逆コンパイル ツールです。これは主に、パッケージ名、バージョン番号、アイコン、その他の情報を含む apk ファイルを逆コンパイルするために使用されます。 AXMLPrinter2 を使用して androidmanifest.xml を逆コンパイルし、プレーン テキストで表示できます。 使用方法 ダウンロードツール AXMLPrinter2.jar ツールのアドレス: https://code.google.com/archive/p/android4me/downloads 表示する AndroidManfist.xml ファイルをツールと同じフォルダーにコピーします。 現在のフォルダーで DOS ウィンドウを開きます。 以下のコマンドを実行します。 java -jar AXMLPrinter2.jar AndroidManifest.xml » AndroidManifest.txt このコマンドを実行すると、フォルダー内にデコードされたファイルである AndroidManifest.txt ファイルが生成されます。 もちろん、実行後にエラーが発生するものもあります。「java」は内部コマンドでも外部コマンドでも、操作可能なプログラムやバッチ ファイルでもありません。 これは、Java 環境がインストールされていないか、環境変数が設定されていないことが原因で発生します。 JDK をインストールします まず、JDK のインストールプロセスを確認してみましょう 1\。 JDKをダウンロードしてインストールします JDK1.6、1.7、または 1.8 をダウンロードすることを選択できます。使いたいものをダウンロードしてください。 JDK をダウンロードするための公式 Web サイト https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html インストールは非常に簡単で、次のステップは簡単です。ここでは詳細には触れません。 2\。 JDK環境変数を構成する (1) コンピュータの「マイ コンピュータ」を右クリックし、Win10 では「このコンピュータ」を選択し、「プロパティ」を選択し、システムの詳細設定を選択し、新しいインターフェースで「環境変数」を選択します。「システム変数」を編集するだけです。 (2) 「新規」をクリックして「JAVA_HOME」という名前の変数を追加します。変数の値は「C:\Program Files\Java\jdk1.8.0_60」です。この値は、インストールした JDK パスです。インストールした場所にそのアドレスを使用するだけです。 「CLASSPATH」という名前の新しい変数を作成します。変数値は「.;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar」です。必ず保存してください。 「.;」を見逃さないように注意してください。値にすべての記号を含める必要があります。 ...

2020年4月19日 · 1 分 · MoeJue

支付宝対面決済連携

当面付(対面支払い)は、その名の通り対面での支払いを指し、店舗がオフラインの消費シーンで迅速な集金を可能にするものです。当面付製品は、バーコード支払いとQRコード決済の2種類の支払い方法をサポートしています。 ここで連携するのはQRコード決済です。 QRコード決済とは、ユーザーがAlipayウォレットの「スキャン」機能を開き、店舗がレジのシーンで提示するQRコードをスキャンして支払いを行うモードを指します。このモードは、オフラインの実店舗での支払い、対面支払いなどのシナリオに適しています。ビジネスフローは以下の図の通りです。 当面付の契約は非常に簡単で、個人事業主/個人商店の契約が許可されています。そのため、この方法はオンラインのQRコード決済にも大量に利用されていますが、Alipayの関連規約に違反するため、一定のリスクがあります。技術交流として、この問題は一旦置いておきましょう。 技術連携としては、当面付製品を契約していなくても開発を進めることができます。 支払い機能は取引と資金に直接関わるため、開発者が支払い機能をデバッグしやすいように、オープンプラットフォームはサンドボックス環境(サンドボックス環境アカウントとサンドボックス版Alipayウォレットを含む)を用意しています。これにより、開発者はサンドボックス環境でデバッグできます。サンドボックスへの接続方法とサンドボックス環境への接続をクリックして詳細を確認してください。 そのため、私の開発ではサンドボックス環境を使用しています。何しろ中にはたくさんのお金があるので、自由に使えますからね。 まず、対応する開発言語のSDKをダウンロードします。ダウンロード:https://docs.open.alipay.com/194/105201/ QRコード決済ドキュメント:https://docs.open.alipay.com/194/106078/ キーの設定 取引当事者(加盟店とAlipay)の身元とデータセキュリティを確保するため、開発者はインターフェースを呼び出す前に、双方のキーを設定し、取引データの双方検証を行う必要があります。 Alipayオープンプラットフォーム開発アシスタントをダウンロードしてキーを生成してください。 キー生成後、開発者はオープンプラットフォーム開発者センターでキー設定を行う必要があります。設定完了後、Alipay公開鍵を取得できます。 設計と連携 私の設計ではポーリング(後述)を使用する必要がないため、追加していません。 以下は私の業務における関連コードです。 public function pay(){ if (request()->isPost()) { // (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线, // 需保证商户系统端不能重复,建议通过数据库sequence生成, $uid = Session::get('sq.uid'); $outTradeNo = order\_num() . $uid; // (必填) 订单标题,粗略描述用户的支付目的。如“xxx品牌xxx门店当面付扫码消费” $subject = '聚合平台用户积分充值'; // (必填) 订单总金额,单位为元,不能超过1亿元 // 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】 $totalAmount = input('post.pay\_money/f'); if($totalAmount < 1){ return \['status' => 1, 'msg' => '最低充值金额1元'\]; } if($totalAmount > 9999999){ return \['status' => 1, 'msg' => '充值最大金额不能超过9999999元'\]; } // (不推荐使用) 订单可打折金额,可以配合商家平台配置折扣活动,如果订单部分商品参与打折,可以将部分商品总价填写至此字段,默认全部商品可打折 // 如果该值未传入,但传入了【订单总金额】,【不可打折金额】 则该值默认为【订单总金额】- 【不可打折金额】 //String discountableAmount = "1.00"; // // (可选) 订单不可打折金额,可以配合商家平台配置折扣活动,如果酒水不参与打折,则将对应金额填写至此字段 // 如果该值未传入,但传入了【订单总金额】,【打折金额】,则该值默认为【订单总金额】-【打折金额】 // $undiscountableAmount = "0.01"; // 卖家支付宝账号ID,用于支持一个签约账号下支持打款到不同的收款账号,(打款到sellerId对应的支付宝账号) // 如果该字段为空,则默认为与支付宝签约的商户的PID,也就是appid对应的PID //$sellerId = ""; // 订单描述,可以对交易或商品进行一个详细地描述,比如填写"购买商品2件共15.00元" $body = "聚合平台用户积分充值" . $totalAmount . '元'; //商户操作员编号,添加此参数可以为商户操作员做销售统计 // $operatorId = ""; // (可选) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持 // $storeId = ""; // 支付宝的店铺编号 // $alipayStoreId= ""; // 业务扩展参数,目前可添加由支付宝分配的系统商编号(通过setSysServiceProviderId方法),系统商开发使用,详情请咨询支付宝技术支持 // $providerId = ""; //系统商pid,作为系统商返佣数据提取的依据 // $extendParams = new ExtendParams(); // $extendParams->setSysServiceProviderId($providerId); // $extendParamsArr = $extendParams->getExtendParams(); // 支付超时,线下扫码交易定义为5分钟 $timeExpress = "5m"; // 商品明细列表,需填写购买商品详细信息, // $goodsDetailList = array(); // // 创建一个商品信息,参数含义分别为商品id(使用国标)、名称、单价(单位为分)、数量,如果需要添加商品类别,详见GoodsDetail // $goods1 = new GoodsDetail(); // $goods1->setGoodsId("apple-01"); // $goods1->setGoodsName("iphone"); // $goods1->setPrice(3000); // $goods1->setQuantity(1); // //得到商品1明细数组 // $goods1Arr = $goods1->getGoodsDetail(); // // 继续创建并添加第一条商品信息,用户购买的产品为“xx牙刷”,单价为5.05元,购买了两件 // $goods2 = new GoodsDetail(); // $goods2->setGoodsId("apple-02"); // $goods2->setGoodsName("ipad"); // $goods2->setPrice(1000); // $goods2->setQuantity(1); // //得到商品1明细数组 // $goods2Arr = $goods2->getGoodsDetail(); // $goodsDetailList = array($goods1Arr,$goods2Arr); //第三方应用授权令牌,商户授权系统商开发模式下使用 $appAuthToken = "";//根据真实值填写 // 创建请求builder,设置请求参数 $qrPayRequestBuilder = new AlipayTradePrecreateContentBuilder(); $qrPayRequestBuilder->setOutTradeNo($outTradeNo); $qrPayRequestBuilder->setTotalAmount($totalAmount); $qrPayRequestBuilder->setTimeExpress($timeExpress); $qrPayRequestBuilder->setSubject($subject); $qrPayRequestBuilder->setBody($body); // $qrPayRequestBuilder->setUndiscountableAmount($undiscountableAmount); // $qrPayRequestBuilder->setExtendParams($extendParamsArr); // $qrPayRequestBuilder->setGoodsDetailList($goodsDetailList); // $qrPayRequestBuilder->setStoreId($storeId); // $qrPayRequestBuilder->setOperatorId($operatorId); // $qrPayRequestBuilder->setAlipayStoreId($alipayStoreId); $qrPayRequestBuilder->setAppAuthToken($appAuthToken); // 调用qrPay方法获取当面付应答 require ROOT\_PATH.'extend/f2fpay/config/config.php'; $qrPay = new AlipayTradeService($config); $qrPayResult = $qrPay->qrPay($qrPayRequestBuilder); // 根据状态值进行业务处理 switch ($qrPayResult->getTradeStatus()){ case "SUCCESS": $response = $qrPayResult->getResponse(); Db::name('order') ->insert(\[ 'uid' => $uid, 'pay\_id' => $outTradeNo, 'money' => $totalAmount, 'creat\_time' => time(), 'subject' => $subject \]); return \['status' => 0, 'msg' => '支付宝创建订单二维码成功!!!"','data' => \[ 'qr\_code' => $response->qr\_code, 'outTradeNo' => $outTradeNo \]\]; // $qrcode = $qrPay->create\_erweima($response->qr\_code); // echo $qrcode; // print\_r($response); break; case "FAILED": return \['status' => 1, 'msg' => '支付宝创建订单二维码失败!!!"'\]; // if(!empty($qrPayResult->getResponse())){ // print\_r($qrPayResult->getResponse()); // } break; case "UNKNOWN": return \['status' => 1, 'msg' => '系统异常,状态未知!!!"'\]; // echo "系统异常,状态未知!!!"."<br>--------------------------<br>"; // if(!empty($qrPayResult->getResponse())){ // print\_r($qrPayResult->getResponse()); // } break; default: return \['status' => 1, 'msg' => '不支持的返回状态,创建订单二维码返回异常!!!'\]; break; } return ; } } 以上が当面付の事前注文コードです。 このSDKについては、どうしても文句を言いたいです。誰が書いたデモなのか、PHPの例にlotusphpフレームワークを導入していて、大量の不要なものが含まれており、私たち開発者が受け入れられるかどうかを全く考慮していません。 私も少し時間をかけてSDKを簡素化し、必要な部分だけを取り出して自分のフレームワークに組み込み、namespaceとオートロードを追加しました。 QRコード決済には独自の機能があります—-非同期通知です。 これはオンライン決済で最も必要とされる機能でもあります。 レジが事前注文リクエストAPIを呼び出してQRコードを生成しユーザーに表示した後、ユーザーが携帯電話でQRコードをスキャンして支払いを行うと、Alipayは当該注文の変更情報を、加盟店が事前注文リクエストを呼び出した際に渡した非同期通知アドレス notify_url に沿って、POSTリクエストの形式で支払い結果をパラメータとして加盟店システムに通知します。 この非同期通知アドレスは、アプリケーション側で設定する必要があることを覚えておいてください。 ...

2020年4月4日 · 3 分 · MoeJue

Discuz!フォーラム 個人スペースのCSSカスタマイズ

先日、暇だったのでDiscuzフォーラムの脆弱性を探してみたところ、本当に見つかりました。ついでにツールを作成し、勢いでこの記事を書いています。 以下が事の経緯です。 この脆弱性はウェブサイトに大きな危害を与えるものではなく、個人スペースのCSSスタイルをカスタマイズできるだけで、サイトのデータに脅威を与えることはありませんので、ご安心ください。 このツールを使えば、Discuzの個人スペースのCSSスタイルをカスタマイズでき、個人スペースを豊かに美化し、単調さをなくすことができます。 テストしたDiscuzのバージョンはX3.4です。他のバージョンはご自身でテストしてください。 全球主机交流论坛(管理人さん、お許しを)でのみテストしました。同じバージョンのDiscuzであれば理論上は共通で使えるはずです。 個人スペースが開設されていないフォーラムでは使用できません。 カスタムCSSは多すぎないようにし、失敗を避けるために一行に圧縮することをお勧めします。 プロトコルヘッダーは通常、変更する必要はありません。テキストボックスを設置したのは、主に拡張性を考慮したためです。 もしlocフォーラムで操作する場合、デフォルトで阿珏ちゃんをフォローし、友達に追加します。[#手動でニヤリ + 保身のための犬アイコン] 本ソフトウェアはローカルでリクエストを送信するのみで、サーバーにデータをアップロードすることはありません。 ソフトウェアはパック(圧縮・暗号化)されているため、ウイルス対策ソフトが誤検知する可能性がありますが、安心してご使用ください Cookieの取得 ブラウザで開発者ツール(F12)を開き、対象のウェブサイトにアクセスします。ログイン状態であればどのページでも構いません。開発者ツールで「Network」タブに切り替え、ページを更新(F5)します。現在のドメインのリクエストデータを見つけてクリックし、「Headers」タブの「Request Headers」にあるcookieを探します。皆さんが私の言っていることを理解できないだろうと思ったので、特別に図を用意しました。 2つ目の方法はより簡単で迅速ですが、どのcookieが必要か分かっている場合に適しています。下の図のように操作します。 1つ目の方法で使う開発者ツールは、以前のブログ記事でも使用しましたが、cookieの取得方法については説明していませんでした。やはり1つ目の方法をお勧めします。cookieは多くても問題ありませんが、少ないと動作しません。 免責事項 本ソフトウェアは学習と交流のみを目的としています! 本ソフトウェアの作者は一切の責任を負いません! 本ソフトウェアを使用した場合、本規約に同意したものとみなします! ダウンロード 以下のダウンロードスタイルは何年も使っていませんでしたが、今日ついに復活させました。 .down_link{background:url(‘https://www.52ecy.cn/content/uploadfile/201707/md-bg.jpeg') no-repeat 100% 0% #fffdff; border: 1px solid #faf8fb; border-radius: 2px; color: #666; font-size: 14px; margin-bottom: 10px; padding: 5px 20px;}.downbtn{background: none repeat scroll 0 0 #1BA1E2; border: 0 none; border-radius: 2px; color: #FFFFFF; cursor: pointer; font-family: “Open Sans”,“Hiragino Sans GB”,“Microsoft YaHei”,“WenQuanYi Micro Hei”,Arial,Verdana,Tahoma,sans-serif; font-size: 14px; margin: -4px 20px 0 0; padding: 8px 30px;text-transform:none;text-decoration:none;} .downlink a{text-decoration:none;} .downlink a{text-decoration:none;font-size:15px;} .downlink a:link{color: #ffffff;} .downlink a:visited{color: #ffffff;} .downlink a:hover{color: #ffffff;} .downlink a:active{color: #ffffff;} .downbtn{background: none repeat scroll 0 0 #1BA1E2; border: 0 none; border-radius: 2px; color: #FFFFFF !important; cursor: pointer; font-family: “Open Sans”,“Hiragino Sans GB”,“Microsoft YaHei”,“WenQuanYi Micro Hei”,Arial,Verdana,Tahoma,sans-serif; font-size: 14px; margin: -4px 20px 0 0; padding: 8px 30px;} .yanshibtn{background: none repeat scroll 0 0 #d33431; border: 0 none; border-radius: 2px; color: #FFFFFF!important; cursor: pointer; font-family: “Open Sans”,“Hiragino Sans GB”,“Microsoft YaHei”,“WenQuanYi Micro Hei”,Arial,Verdana,Tahoma,sans-serif; font-size: 14px; margin: -4px 20px 0 0; padding: 8px 30px;text-transform:none;text-decoration:none;} .downbtn:hover,.yanshibtn:hover{background: none repeat scroll 0 0 #9B59B6; border: 0 none; border-radius: 2px; color: #FFFFFF!important; cursor: pointer; font-family: “Open Sans”,“Hiragino Sans GB”,“Microsoft YaHei”,“WenQuanYi Micro Hei”,Arial,Verdana,Tahoma,sans-serif; font-size: 14px; margin: -4px 20px 0 0; padding: 8px 30px;} .downbtn a:hover,.yanshibtn a:hover{background: none repeat scroll 0 0 #9B59B6; border: 0 none; border-radius: 2px; color: #FFFFFF; cursor: pointer; font-family: “Open Sans”,“Hiragino Sans GB”,“Microsoft YaHei”,“WenQuanYi Micro Hei”,Arial,Verdana,Tahoma,sans-serif; font-size: 14px; margin: -4px 20px 0 0; padding: 8px 30px;} ...

2020年3月24日 · 2 分 · MoeJue

フォームをスマートに送信するには

これは非常に基本的なHTMLフォームの送信に関する問題ですが、非常に実用的なテクニックでもあります。 私の業務シーンは次のとおりです: inputを動的に作成できるフォームです。下の図のように。 これは、inputのnameを固定値にできないことを意味します。さもなければ、間違いなく上書きされてしまいます。 1つ目は、従来の一般的な送信方法で、送信する各inputに一意のnameを付けます。 ...... ブラウザが送信したデータをキャプチャした形式は次のようになります。 サーバー側で取得して出力するとこのようになり、バックエンドでのデータ処理には非常に不親切です。 2つ目は、配列形式でのフォーム送信です。 ...... ブラウザとバックエンドでの出力はそれぞれ次のようになります。 よく見ると、送信されたnameの値が変化し、同じような?配列?になっていることがわかります。 バックエンドに送信すると、データが以前よりもずっと整理されていることがわかります。 ただし、ここで注意すべき点は、送信する配列のキーに引用符を使用する必要はないということです。さもなければ、引用符もキーの一部になってしまいます。 もちろん、実際の開発では、送信するグループの数(上記の1、2、3のような)が不確定で、フロントエンドで自由に追加できるという問題に遭遇することもあります。このような場合、どうやって配列を使ってこれらの内容を送信すればよいのでしょうか? 以下が私の業務での実際の解決策です このようにすれば、2次元配列のキーを自分で管理する必要がなくなり、ブラウザが自動的に生成してくれます。 バックエンドで受信したデータはこのようになり、非常に処理しやすくなります。 この方法は、不確定な数の関連データセットをまとめて送信する場合に適しています。 一件落着!〜

2019年5月6日 · 1 分 · MoeJue

WeChat JSAPI 決済

以前からWeChat関連の業務を行っていましたが、新しい技術ではないものの、これまで触れる機会がなく、いくつかの落とし穴にはまりました。そこで、時間を取って整理し、記録しておきます。 WeChat Payは全部で7種類あり、それぞれ:支払いコード決済、JSAPI決済、Native決済、APP決済、H5決済、ミニプログラム決済、顔認証決済です。 今回の業務で使用したのはWeChat JSAPI決済です。ユーザーがWeChatスキャン、公式アカウントのフォローなどの方法で販売者のH5ページに入り、WeChat内でJSSDKを呼び出して支払いを完了します。 ドキュメント:https://pay.weixin.qq.com/wiki/doc/api/index.html SDK:[https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=11_1 ](https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=11_1)JSAPI決済は、WeChat内のブラウザで開くことでWeChat Payを起動できます。効果は以下の図の通りです。 インターフェースコードを添付します。 コードではテンプレートエンジンを使用しています。 html: {$competition\['username'\]} {$prices\[0\]}钻 {$prices\[1\]}钻 {$prices\[2\]}钻 {$prices\[3\]}钻 {$prices\[4\]}钻 注:1钻=1元,1钻={$activity\['offset'\]}票 立即微信支付 JavaScript: // 投票 var offset = {$activity[‘offset’]}; $(’#tips’).html(‘正在给{$competition[‘code’]}号赠送{$prices[0]}钻=’+({$prices[0]}*offset)+‘票’); $(’#vote’).click(function(){ $.post(’/index/index/detailed.html?cid={$cid}&aid={$aid}’,{ formhash :’{FORMHASH}’, submit:‘1’, type:1, openid:’{$_G[‘member’][‘openid’]}’ },function(res){ alert(res.msg); if (res.code == 0) { $(’.box-1 span’).text(res.data.all); $(’.box-2 span’).text(res.data.rank); $(’.box-3 span’).text(res.data.up + ‘票’); } }); }) /* jQuery对象级别プラグイン拡張 */ $.fn.extend({ /* 単選框 */ hlRadio:function () { var radioEl=$(this); radioEl.click(function () { var price = 0; price = $(‘input:radio:checked’).val(); $(’#price’).val(’’); $(’#tips’).html(‘正在给{$competition[‘code’]}号赠送’+price+‘钻=’+(price*offset)+‘票’); radioEl.siblings(“div”).removeClass(“active”); $(this).siblings(“div”).addClass(“active”); }); }, }); $(“input[name=‘price’]”).hlRadio(); $(’#price’).bind(‘input propertychange’, function(){ var price = 0; price = $(’#price’).val(); $(’#tips’).html(‘正在给{$competition[‘code’]}号赠送’+price+‘钻=’+(price*offset)+‘票’); }) ...

2019年3月30日 · 4 分 · MoeJue

[ノート]Git常用コマンド大全

前回に引き続き、時間を見つけてGitの主要なコマンドをまとめました。非常に素晴らしい、高解像度(1759*3162)のチートシートを見つけました。 ファイルの表示、追加、コミット、削除、復元、変更のリセット git help # のヘルプを表示 git show # 特定のコミットの内容を表示 git show $id git co – # ワークスペースの変更を破棄 git co . # ワークスペースの変更を破棄 git add # 作業ファイルの変更をローカルのステージングエリアにコミット git add . # 変更されたすべての作業ファイルをステージングエリアにコミット git rm # バージョン管理からファイルを削除 git rm –cached # バージョン管理からファイルを削除するが、ファイル自体は削除しない git reset # ステージングエリアから作業ファイルに復元 git reset – . # ステージングエリアから作業ファイルに復元 git reset –hard # 直近のコミットの状態に戻す。つまり、前回のコミット以降のすべての変更を破棄 git ci git ci . git ci -a # git add, git rm, git ciなどの操作を一度にまとめて実行 git ci -am “some comments” ...

2018年6月16日 · 3 分 · MoeJue