ホームページ > Java > &#&チュートリアル > WeChat パブリック アカウント決済開発 (Java) 例の詳細な説明

WeChat パブリック アカウント決済開発 (Java) 例の詳細な説明

零下一度
リリース: 2017-07-19 13:26:20
オリジナル
3947 人が閲覧しました

以前、会社のプロジェクト開発における支払いは、シンプルでカジュアルと呼ばれるアリババの支払いを使用して行われていましたが、悲しいことに、現在は会社がWeChat公式アカウントを開発したため、落とし穴に満ちたWeChat支払い開発に足を踏み入れました。 。 。

ビジネスプロセス:

この WeChat 公式 Web サイトで詳しく説明されています (ポータル:)。

一般的なプロセスは次のとおりです: ユーザーが支払いボタンをクリック -> バックエンド処理 (実際には、支払いに必要なデータをカプセル化して prepay_id を取得し、それといくつかの必要なパラメータをカプセル化して渡すことです)フロントデスクに送信します)--> フロントデスクはデータを受け取り、WeChat の js を呼び出してデータを処理し、支払いを呼び出します--> ユーザーには、金額やその他の情報を含むパスワードを入力するためのインターフェイスが表示されます-- >ユーザーがパスワードを入力すると、支払い成功ページが表示され、WeChat が インターフェースをコールバックします 支払い結果を通知します (プロセスのこの部分は WeChat 自体によって完了します。心配する必要はありません)それについて) --> システム自身のページに戻ります。

開発手順:

1. 支払いディレクトリを設定します

この公式ドキュメントは、読んだ後、混乱して少しめまいがするほど書かれています。理解できませんが、すごいと思います!ポータル:

2. 承認済みドメイン名を設定します

これら 2 つのステップを完了したら、大きな穴が近づいているので、休憩しても構いません。 。 。

3. マーチャントサーバーは統合注文インターフェースを呼び出して注文をリクエストします

これは何をするのでしょうか?最初にそれを始めたとき、私は混乱しましたが、WeChat 決済チームを「NB」と呼ぶのは誰ですか? 。 。理解できない場合は、ドキュメントに従ってください

ポータル: WeChat 公式がパラメーターについて詳しく説明しました。長い間読んだ後、必要なパラメータをいくつかカプセル化して、このインターフェイスにアクセスしてデータを取得するという方法で要約しました。以下は、他の人の紹介を詳細に直接コピーするパラメータです:

appid == アプリケーション ID == WeChat 公式アカウントへのバックエンド - 開発 - 基本設定へのログイン
mch_id == WeChat 支払い加盟店番号 == ログWeChat 支払いバックエンドにアクセスすると、
device_info==デバイス番号==端末デバイス番号 (店舗番号またはレジのデバイス ID) が表示されます。 注: PC Web ページまたは公式アカウントでの支払いには「WEB」を渡してください。
本文==商品説明==商品または支払い注文の簡単な説明 (最初は英語で送信することをお勧めします。中国語で送信しないようにしてください。そうしないと、支払い命令があるかどうかを確認する方法がありません)署名の問題は後ほど)
trade_type==トランザクションタイプ==値は次のとおりです: JSAPI、NATIVE、APP。ここで使用する JSAPI。タイトルにもありますが、WeChat公式アカウント決済です。それらの違いについては、
ps: JSAPI--パブリックアカウント支払い、NATIVE--ネイティブスキャンコード支払い、APP--アプリ支払い、統合注文インターフェイス trade_type のパラメータはここで参照できます。 MICROPAY - カードによる支払い。カードによる支払いには、統合された注文インターフェイスがありません。
nonce_str==random string==ランダムな文字列、32 ビット以下 (参照アルゴリズム)、
notify_url==notification。 address= =WeChat 支払いの非同期通知コールバック アドレスを受け取ります。通知 URL は直接アクセス可能な URL である必要があり、パラメーターを含めることはできません。 (ここで、どんな名前がいいですか? 気軽に付けてください。どうせしばらくは必要ありません。)
out_trade_no==販売者注文番号==販売者システム内の注文番号。32 文字以内で、文字を含めることができます (参考:) (WeChat で公式の説明を読むたびに、さらに混乱します。何かありますか? 問題ありません。1 つだけ送信します。)

total_fee==合計金額==合計金額オーダー、
単位はセントです(これに注意してください。最初は気にしていませんでした。通過したのは0.01、開発費は1セントでした。その後、悲劇になりました。何度も読んでいると、単位はセントです)
openid==user ID==trade_type =JSAPI、このパラメータには、マーチャントの appid に基づくユーザーの一意の識別子を渡す必要があります。 (これがどこから来たのか分からなくても、問題ありません。WeChat が私たちのために文書を書いてくれませんでしたか?)
そして最も重要なこと、重要な文字は常に最後に表示されます。
attach==クエリ API および支払い通知で変更されずに返される追加データは、カスタム パラメーターとして使用できます。 (これは非常に便利で、WeChat コールバックでビジネス データを処理するため、ビジネス データの保存に使用できると思います。このパラメーターの使用は安全で手間がかかりません)
sign==signature==公式署名アルゴリズム。 。理解できていない、理解できていると思っているなら、多少の署名ミスがなければ、WeChat 決済をしたと言うのは恥ずかしいことでしょうか。 (個人的には開発する際に公式SDKのツールを使用することをお勧めします。そうすることでコストを節約できます。SDKをダウンロードして、ここでJava APIに対応するサンプルを呼び出すのは非常に面倒です。その中には多くのツールがあります)
は、このサインにはもっと重要なパラメーターがあると言いました。署名に含まれるパラメータ。とにかく、見つけるのに時間がかかりました。 (会社運営がWeChat決済を申請しました。私が彼女にそれを尋ねたとき、彼の表情はこんな感じでした。)
key==key設定パス: WeChatマーチャントプラットフォーム(pay.weixin.qq.com)--> アカウント設定-->API セキュリティ -->キー設定 (これは非常に重要です。署名に使用されます)

この部分の概要は、まずデータをマップにカプセル化し、次にそれを変換することです。ツールを介して XML に入力し (ツールは上で説明されています。戻って自分で読み込んでください)、ポスト リクエストを通じて [WeChat 統合注文インターフェイス] をリクエストします。署名に問題がなければ、大量の XML が返されます。このパラメータに必要なデータは prepay_id です。署名を生成してフロント デスクに戻ります。これでこの手順は完了です。

問題の概要 (このプロセスで遭遇した問題): 1 (重要) appid と openid は一致する必要があります。つまり、ユーザーの openid は現在の公式アカウント (公式アカウントが複数あります) のユーザーである必要があります。もしかしたらこの問題に遭遇することはないかもしれませんが、非常に重要なので、最初にお話しさせてください) 2

<span style="text-decoration: underline; color: #ff0000">第二步,生成签名并返回到前台</span><span style="color: #ff0000">这个过程中一定要注意参数一定要写对了,大小写,是否有空格,我在这上面掉了一个大坑,界面调用支付时一直闪退,注意.<br><br></span>
ログイン後にコピー

4、H5は、渡されたパラメータでWeChat支払いの組み込みJSを呼び出します

バックグラウンドのフロントデスクに戻ります。次の項目が含まれている必要があります:
appId==これは変更されません==決して変更されません
timeStamp==タイムスタンプ==ルール:。読んだ後でもまだ混乱しています。それは問題ではありません。ツールクラスはあります。

nonceStr == とにかく、先ほど署名と同じランダムな文字列を使用しました。理論的には、使用しなくても問題はありません。勤勉な友人は試してみてください。

package==注文詳細拡張文字列==統合注文インターフェイスによって返される prepay_id パラメータ値。送信形式は次のとおりです: prepay_id= *** (推測してください) ちなみに、ここでは多大な労力をかけて取得した prepay_id が使用されています)
signType==署名メソッド==署名アルゴリズム、一時的に MD5 をサポートします
paySign==署名==この署名は次のことを行う必要があります。バックグラウンドで再生成されます。上記の 4 つのパラメータ + キーを使用します (決して変更しないでください)。 (署名生成時のタイムスタンプとフロントに返送されたタイムスタンプは同じです。異なっていても機能しますか?検証はありません)
paySign を生成するコード
注: 生成時prepay_id、appid は小文字の i、paySign を生成するときの appId は大文字の I、これら 2 つは異なります
すべてがうまくいけば、このページが表示されます
これらすべてが完了したら、リラックスできます
5番目、WeChatコールバック処理
この部分には次の3つの小さなステップがあります

1)渡されたフロー情報を解析し、再署名することでフローに含まれる情報の正確性を検証します。この情報がWeChatで送信されているかどうかを判断するためです

2) return_codeとresult_codeが両方ともSUCCESSの場合、マーチャント独自のビジネスロジックを処理します。それは注文の支払いステータスとその他の情報だけです。

3) WeChatに戻り値を受け取ったと伝えてください。もう投稿する必要はありません。

特に言うことはありません。コードを投稿するだけです。

public String return_data(HttpServletRequest request, HttpServletResponse response) throws Exception {
        logger.info("微信支付请求回调了");
        String resXml = "";
        Map<String, String> backxml = new HashMap<String, String>();
        InputStream inStream;try {
            inStream = request.getInputStream();
            ByteArrayOutputStream outSteam = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while ((len = inStream.read(buffer)) != -1) {
                outSteam.write(buffer, 0, len);
            }
            outSteam.close();
            inStream.close();
            String result = new String(outSteam.toByteArray(), "utf-8");// 获取微信调用我们notify_url的返回信息Map<String, String> map = WXPayUtil.xmlToMap(result);if (map.get("result_code").toString().equalsIgnoreCase("SUCCESS")) {if (WXPayUtil.isSignatureValid(map, PayConfigUtil.API_KEY)) {
                    logger.info("微信支付-签名验证成功");//                    backxml.put("return_code", "SUCCESS");//                    backxml.put("return_msg", "OK");//                    String toXml = WXPayUtil.mapToXml(backxml);//                    response.getWriter().write(toXml);resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"+ "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";//业务处理开始                   //业务处理结束                }
                BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());out.write(resXml.getBytes());out.flush();out.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }return resXml;
    }
ログイン後にコピー
覚えておいてください、

3、マーチャントサーバーは統合注文インターフェースを呼び出して注文をリクエストしますattachパラメータで、ここにビジネスデータを取り込むと非常に便利です

以上がWeChat パブリック アカウント決済開発 (Java) 例の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート