ビジネスプロセス
WeChatの公式ウェブサイトは非常に詳しく、写真も掲載されています。もう一度言います。
ユーザーが支払いボタンをクリックします-->{バックグラウンドでの大きなプッシュ処理}-->ユーザーには、金額やその他の情報を含むパスワードを入力するためのインターフェイスが表示されます-->ユーザーがパスワードを入力した後、支払い成功ページが表示されます (プロセスのこの部分は WeChat 自体によって完了します。何もする必要はありません) --> システム独自のページに戻ります (ユーザーにページを見続けさせることはできません)支払いが完了したら、お金を使ってしまい、気分が悪いので、急いでください〜しばらくしてから後悔しました、返金を申請するにはどうすればいいですか?
開発プロセス
1) ユーザーの承認を取得します (これを行うかどうかは関係ありません。私はまだ行っていません。)
2) 統合注文インターフェースを呼び出して前払い ID を取得します
3) H5 は、構築された-WeChat決済のJS内
4) 支払い完了後、WeChatコールバックURL処理
長いテキストを見て、とても不快ではありませんか?この文をどこで見たのか忘れてしまいました。数千の単語の代わりに 1 つの画像を使用します (画像の赤い部分がやるべきことです。あまり多くはないようです
この記事の主要部分が始まります (コードを直接表示したい場合) 、コードを貼り付けても、見えないかもしれません。それは、コードが難しい、さまざまな分離、さまざまなクラスが簡単ではないという意味ではありません。最後の署名エラー、つまり $get_brand_wcpay_request:fail.$key0 はまだ修正する必要があります。) 最近英語の学習に苦労しています。意味がわからない場合は読み飛ばしてください。友達はいつも私の笑い声が他の人と違うと言います
1. 統一された注文を生成し、prepay_id を取得します。
必要なパラメータ == 名前 == パラメータの詳細については、
公式が説明しています。 https://pay.weixin.qq.com/wiki/doc/api/. jsapi.php?chapter=9_1 一部のパラメータの場所がまだわからない場合は、引き続き下を見てください
appid = = アプリケーション ID == WeChat 公式アカウント バックエンドにログイン - 開発 - 基本設定
mch_id == WeChat 支払いマーチャント ID == WeChat 支払いバックエンドにログインすると、
device_info == デバイス番号 == ターミナルが表示されます端末番号(店舗番号またはレジ端末ID) 注:PCウェブページまたは公式アカウントでのお支払いには「WEB」を渡してください
body==商品説明==商品または支払い注文の簡単な説明(それが何であるかはわかりませんが、問題はありません。最初に文字列を渡し、それが中国語の場合は、この時点で賢明な判断で満点を獲得できるでしょう。署名エラー、深刻なものはあなたの命を疑い始めます)
trade_type==トランザクション タイプの値は次のとおりです: ここで使用する JSAPI のタイトルは、はい、WeChat 公式です。アカウント支払い
ps: JSAPI - 公式アカウント支払い、NATIVE - ネイティブ スキャン コード支払い、APP - アプリ支払い、統合注文インターフェイス trade_type のパラメータはここにあります。カード用の別の支払いインターフェイスがあります。支払い、統一された注文インターフェイスは呼び出されません
nonce_str==random string==random string, not more than 32 digit
ps: nonce という名前に友達は驚くかもしれませんが、全員が WeChat チームのメンバーですか?百科事典を調べてみると、乱数もnonceで表されます(好奇心旺盛な赤ちゃんは、たゆまぬ努力でnonceの意味を調べることができます。)、
これは、一度使ったことがあることに気づきました。
notify_url==通知アドレス==WeChat 支払いの非同期通知を受信するためのコールバック アドレス。通知 URL は直接アクセス可能な URL である必要があり、パラメーターを含めることはできません。 (ここで、どんな名前がいいですか? 気軽に付けてください。どうせしばらくは必要ありません。)
out_trade_no==販売者注文番号==販売者システム内の注文番号。32 文字以内で、文字 (それぞれに文字を含めることができます) WeChat の公式説明を読んでさらに混乱しました。問題ありません。送信します。1)
total_fee==合計金額==注文の合計金額、単位はセントです (会社の場合)。プロジェクトのテスト)、自分で支払わなければなりません、1セントはまだお金です ps:このとき、私はクラスメートがハエの足も肉であると言ったことを常に覚えています)
openid==user ID==trade_type= JSAPI の場合、このパラメータは販売者の appid の下にあるユーザーの一意の識別子を渡す必要があります。
そして最も重要なこと、重要なキャラクターは必ず最後に登場します。
sign==signature==公式署名アルゴリズム。 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3。理解できません、よくわかりません。多少の署名ミスがなければ、理解できたと言えるでしょうか。 WeChat決済の開発?
は、このサインにはもっと重要なパラメーターがあると言いました。署名に含まれるパラメータ。とにかく、見つけるのに時間がかかりました。 (会社運営で申請したWeChat支払いですが、お願いしたいとお願いした時の表情はこんな感じでした。
key==key設定パス: WeChatマーチャントプラットフォーム(pay.weixin.qq.com)--> ;アカウント設定 --> API セキュリティ --> キー設定
こちら:
オンラインで見つける方法についての説明があります。探すのが面倒だ。自分で文字列を考えて、それを MD5 を使用して 32 ビット文字列に暗号化し、リセットしました。
このキーの値は署名の生成時に使用されるため、保存する必要があります。
他の人が署名を生成するために多くのことを使用しているのを見ました。とにかく、私は署名を生成するために上記のパラメーターを使用しました (これは WeChat ではなく私のブログを指します。誤解を減らすために、これを投稿しました。署名署名)
私の署名署名のパラメータ
上記のパラメータを準備したら、XML にカプセル化します
形式は次のとおりです:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><xml> <appid>wxb1427ebebexxxxxx</appid> XXX费用 <device_info>WEB</device_info> <mch_id>132186xxxx</mch_id> <nonce_str>6AED000AF86A084F9CB0264161E29DD3</nonce_str> <notify_url>https://一个域名/api/wechatPay/jsapiPayNotify</notify_url> <openid>oo8WUt0taCqjt552htW1vw-xxxxx</openid> <out_trade_no>1</out_trade_no> <sign>各种排序+key生成的那个sign</sign> <total_fee>1</total_fee> <trade_type>JSAPI</trade_type></xml>
WeChat の統一注文アドレスに電話します: https://api .mch.weixin.qq.com/pay/unifiedorder
奇跡の瞬間を目撃してください。上記のパラメータがすべて魔法のように正しい場合、次の形式で WeChat から返される XML 文字列を受け取ります
<xml> <return_code></return_code> <return_msg></return_msg> <appid></appid> <mch_id></mch_id> <device_info></device_info> <nonce_str></nonce_str> <sign></sign> <result_code></result_code> <prepay_id></prepay_id> <trade_type></trade_type></xml>
必要なのはこれです
prepay_id 获取到这货之后,第一步骤已经结束了,可以去喝个茶,吃个冰棍,小庆祝一下。 2、H5调起微信支付的内置JS
バックグラウンドからフロント デスクに返されるパラメータには、次のものが含まれている必要があります項目:
appId==これは変更されません==変更されません
timeStamp==タイムスタンプ==ルール: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?読んだ後でもまだ混乱しています。それは問題ではありません。ツールクラスはあります。直接呼び出してみてください
nonceStr == とにかく、先ほど署名と同じランダムな文字列を使用しました。理論的には、使用しなくても問題はありません。勤勉な友人は試してみてください。
package==注文詳細拡張文字列==統合注文インターフェイスによって返される prepay_id パラメータ値。送信形式は次のとおりです: prepay_id= *** (推測です) ちなみに、ここでは苦労して取得した prepay_id を使用しました。初めて使用したときは、注文 ID を使用してリクエストを続けたところ、WeChat から受け取ったメッセージは次のとおりでした。リクエストパラメータが間違っていて、パラメータ$key0$が欠落していました。それは私だけです)
signType==署名メソッド==署名アルゴリズム、一時的にMD5をサポートします
paySign==署名==この署名はバックグラウンドで再生成する必要があります。上記の 4 つのパラメータ + キーを使用します (決して変更しないでください)。 (署名を生成したときのタイムスタンプとフロントデスクに返送されたタイムスタンプは同じです。異なる場合でも機能しますか?検証はありません)
paySign を生成するコード
NB: prepay_id を生成する場合、appid は小文字の i で、paySign を生成する場合、appId は大文字の I になります
ここまでで、すべてがうまくいけば、このようなページが表示されます。
しかし、もしこれを見ていなかったらどうでしょうか。代わりに、ディレクトリが承認されていない、またはテスト アカウントがホワイトリストにないというメッセージが表示されます。これがこのブログを開く正しい方法だと思います。
WeChat公式アカウントバックエンド、WeChat支払い、開発構成には支払い承認ディレクトリ、テスト承認ディレクトリ、
支払い承認ディレクトリがあります:開発時には最初に置きます。 (鄧小平おじいちゃんは、日中関係を扱う際に、解決できない問題は脇に置いておくべきだとかつて言いました。)
テスト認証ディレクトリ: これは私たちが記入する必要があるものです。外部からアクセスできるアドレスが必要です。 IP も使用できます (個人的にテストできます)。外部ネットワークから IP にアクセスできない場合は、運用保守のクラスメートに解決を依頼してください。テスト用に外部ネットワークからアクセスできるドメイン名を構成することをお勧めします。
テストホワイトリスト: これでは説明できません
パスワードを入力すると、次のような結果が表示されます。 (これは私たちが何もする必要はありません)
とても興奮しているので、内なる興奮を抑えるためにすぐに何か食べに行きましょう。
残りについては、やるべきことがまだ2つあります。まずは簡単なものからお話しましょう。
3. 支払いが成功したら、自分のシステムの特定のページに戻ります
function onBridgeReady(){ WeixinJSBridge.invoke ( 'getBrandWCPayRequest', { "appId" : appId, //公众号名称,由商户传入 "timeStamp":timeStamp, //时间戳,自1970年以来的秒数 "nonceStr" : nonceStr, //随机串 "package" : Package, "signType" :signType, //微信签名方式: "paySign" : paySign //微信签名 }, function(res){ if(res.err_msg == "get_brand_wcpay_request:ok" ) { window.location.replace("index.html"); } } ); }
上記のコードの赤い部分を、行きたいページに変更するだけです。代替品が何なのか知りたいですか?ここに移動してご覧ください: //m.sbmmt.com/
4、最後の部分。戦闘
この部分には次の 3 つの小さなステップがあります
1) 渡されたストリーム情報を解析し、再署名することでストリームに含まれる情報の正確性を検証します。情報がWeChatで送信されたかどうかを判断するためです
Medieus >> return_codeとresult_codeが両方ともSUCCESSの場合、マーチャント独自のビジネスロジックを処理します。注文の支払いステータスとその他の情報だけです。
3)告诉微信,我收到你的返回值了。不用在发了。
关于以上三点的解释。微信官方是这么说的
//支付完成后,微信会把相关支付和用户信息发送到商户设定的通知URL, //验证签名,并回应微信。 //对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败, //微信会通过一定的策略(如30分钟共8次)定期重新发起通知, //尽可能提高通知的成功率,但微信不保证通知最终能成功。 //商户自行增加处理流程, //例如:更新订单状态 //例如:数据库操作 //例如:推送支付完成信息
还记得我们在第一步生成预支付id(prepay_id时的那个notify_url吗。如果不记得了,请往上翻。如果当时只是随便写了一个,那么这会需要去改一改了。)
一个能访问的到的action.同样地址需要外网能访问的到。没有试ip好不好使。开发这部分功能的时候,运维同学已经配置了测试域名。好开心啊,终于不用在纠结于一些交互配置了。
和支付宝不同,微信返回的是流。和支付宝不同,微信返回的是流。和支付宝不同,微信返回的是流。重要的事情说三遍
解析之后,得到的格式是这样子的
<xml><appid><![CDATA[wxb1427ebebeeaxxxx]]></appid> <bank_type><![CDATA[CFT]]></bank_type> <cash_fee><![CDATA[1]]></cash_fee> <device_info><![CDATA[WEB]]></device_info> <fee_type><![CDATA[CNY]]></fee_type> <is_subscribe><![CDATA[Y]]></is_subscribe> <mch_id><![CDATA[132186xxxx]]></mch_id> <nonce_str><![CDATA[07FC15C9D169EE48573EDD749D25945D]]></nonce_str> <openid><![CDATA[oo8WUt0taCqjt552htW1vw-xxxxx]]></openid> <out_trade_no><![CDATA[你的订单编号]]></out_trade_no> <result_code><![CDATA[SUCCESS]]></result_code> <return_code><![CDATA[SUCCESS]]></return_code> <sign><![CDATA[E69940B3EDC437CB5A181210D523806E]]></sign> <time_end><![CDATA[20160621134204]]></time_end> <total_fee>1</total_fee> <trade_type><![CDATA[JSAPI]]></trade_type> <transaction_id><![CDATA[400386200120160621763973xxxx]]></transaction_id> </xml>
对以上第一点和第三点做个解释。
再次吐槽一下。微信真的很喜欢用签名啊。整个过程,3遍签名。也是醉了。
1)我们看到上述微信返回的xml中含有很多字段。使用上述xml中,处sign意外的值+key,进行签名。你没有看错。包含result_code和return_code。
微信的官方对于签名有解释。
原谅我真的好久不学语文了。真的没理解这句话,是用微信回调函数中传的参数,进行重新签名。傻傻的,还在想,用第二次签名是的参数进行签名,时间戳怎么办,要不要存在数据库里面。
将获得的签名与xml中的sign对比,如果相同,证明是微信返回的通知。如果不同,你的通知地址可能被黑客破解了。要不要告诉老板呢,告诉老板了,我怎么解决呢。
2)商户逻辑处理,不解释
3)告诉微信,我收到了你的通知,不需要在发送了。
怎么告诉微信呢。我翻遍了微信的文档,也没有找到回复微信通知这个url。
经人知道,再一次的刷新了认知观。用response.
我是这么写的
response.getWriter().write(xml);
这个xml就是微信给你的那个流转化的字符串。
xml中的return_code要是SUCCESS或者FAIL
别问我怎么知道的。官方的demo里面写的
if($notify->checkSign() == FALSE){ $notify->setReturnParameter("return_code","FAIL");//返回状态码 $notify->setReturnParameter("return_msg","签名失败");//返回信息 }else{ $notify->setReturnParameter("return_code","SUCCESS");//设置返回码 } $returnXml = $notify->returnXml();
按照这个写法,返回的数据。在没有收到微信的通知。
之前在测试的时候,返回字符串之后,在没有收到微信的通知,这两天偶然查日志,发现,微信在一直的,通知,不一定是8次。从打印的日志看
有4次,6次。突然,好晕啊。有明白的朋友,还请多多指教
--------------------------------------------------------------
微信公众号支付--JSAPI的开发思路和一下参数的具体解释,全部完成了。具体代码。等我从公司项目里面抽出来。在整理。
还有一个坑:我们在第一步的时候,body传的是英文,如果传中文,直接能用的赶紧感谢一下上苍,返回参数错误的,应该是正常吧。
我的对象和xml转化是用的Java的JAXBContext。很好用的赶脚。赶脚比XMLStream好用。
更多WeChat パブリック アカウント支払い開発の全プロセス相关文章请关注PHP中文网!