ホームページ >WeChat アプレット >WeChatの開発 >WeChat開発のためのWeChat支払い
1. WeChat バックグラウンド設定
1. テスト認証ディレクトリとテスト ホワイトリストを追加します。
WeChat バックグラウンドで、テスト認証ディレクトリ (xxx.sinaapp.com/example/ など) を設定し、それを追加します。テストのホワイトリスト WeChat ID。
ここでの「個人 WeChat ID」は、QQ アカウントや個人のニックネームではないことに注意してください。これは、WeChat にログインした後の「Me」インターフェースの「WeChat ID」フィールドの文字列です。
ただテストしているだけなので、支払い承認ディレクトリが設定されているかどうかは関係ありません。
2. コンテンツのリスト
Web ページの承認済みドメイン名を設定します:
「開発者センター/インターフェイス権限テーブル/Web ページのアカウント/ユーザーの基本情報を取得する Web ページの権限」で設定します。 Web ページの承認済みドメイン名は、xxx.sinaapp.com などのテスト サーバーのドメイン名に設定されます。http:// は必要ありません。
1. 証明書をダウンロードします
「アカウント設定/APIセキュリティ/API証明書」でダウンロードします。管理者の携帯電話認証コードが必要です。ダウンロードして解凍した後、apiclient_key.pem と apiclient_cert.pem を使用する必要があります。
2. 支払いキーを生成
「アカウント設定/APIセキュリティ/APIキー」で設定します。支払いキーは支払い時に使用されます。この値は、ソース コード構成ファイル内の KEY 定数です。
1. 主に Wxpay.pub.config.php の設定を変更します:
const APPID //公众号中“开发者中心”看到的AppID const MCHID //微信支付商户资料审核成功邮件中的商户号 const KEY //你在商户平台中设置的支付key const APPSECRET //公众号中“开发者中心”看到的AppSecret const JS_API_CALL_URL //设置这个url,可在此页面中获得用户的openid。 //证书路径,注意应该填写绝对路径 const SSLCERT_PATH // apiclient_cert.pem文件url const SSLKEY_PATH // apiclient_key.pem文件url,如’/cert/ apiclient_key.pem’ const NOTIFY_URL //异步通知url,可使用demo中的notify_url.php
2. 公式コードのバグを変更します:
If "curl_setopt( ) パラメータ 2 が長いことが予想されます」というエラーは、WxPayPubHelper.php 内に「curl_setopt」のスペルを間違えて「curl_setop」としている箇所がいくつかあるためです。それを修正するだけです。 「curl_close(): 11 is not a valid」が表示される場合は、閉じられたcurlセッションが誤って閉じられたことが原因です:
if(gettype($ch) == 'resource') curl_close($ch);
3. 公式デモは直接実行できません。私たちはそれを自分たちで理解する必要があります。まず、index.php にリンクを追加します:
<a href="pay.php"> 获取openid</a></h4>
3. 次に、pay.php ページを作成してユーザーの openid を取得し、支払いを開始します:
<?php /** * JS_API支付demo * ==================================================== * 在微信浏览器里面打开H5网页中执行JS调起支付。接口输入输出数据格式为JSON。 * 成功调起支付需要三个步骤: * 步骤1:网页授权获取用户openid * 步骤2:使用统一支付接口,获取prepay_id * 步骤3:使用jsapi调起支付 */ include_once ("WxPayPubHelper.php"); $jsApi = new JsApi_pub(); // =========步骤1:网页授权获取用户openid============ // 通过code获得openid if (! isset($_GET['code'])) { // 触发微信返回code码 $url = $jsApi->createOauthUrlForCode(WxPayConf_pub::JS_API_CALL_URL); Header("Location: $url"); } else { // 获取code码,以获取openid $code = $_GET['code']; $jsApi->setCode($code); $openid = $jsApi->getOpenId(); } $goods = "test"; // 使用统一支付接口 $unifiedOrder = new UnifiedOrder_pub(); $unifiedOrder->setParameter("openid", "$openid"); // 用户openid $unifiedOrder->setParameter("body", "$goods"); // 商品描述 // 自定义订单号,此处仅作举例 $timeStamp = time(); $out_trade_no = WxPayConf_pub::APPID . "$timeStamp"; // 商户订单号 $unifiedOrder->setParameter("out_trade_no", "$out_trade_no"); $price = "1"; $unifiedOrder->setParameter("total_fee", "$price"); // 总金额 $unifiedOrder->setParameter("notify_url", WxPayConf_pub::NOTIFY_URL); // 通知地址 $unifiedOrder->setParameter("trade_type", "JSAPI"); // 交易类型 $prepay_id = $unifiedOrder->getPrepayId(); // =========步骤3:使用jsapi调起支付============ $jsApi->setPrepayId($prepay_id); $jsApiParameters = $jsApi->getParameters(); echo $jsApiParameters; ?> <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <meta name="viewport" content="width=device-width,initial-scale=1.0" /> <title>微信安全支付</title> <script type="text/javascript"> //调用微信JS api 支付 function jsApiCall() { WeixinJSBridge.invoke( 'getBrandWCPayRequest', <?php echo $jsApiParameters; ?>, function(res){ WeixinJSBridge.log(res.err_msg); //alert(res.err_code+res.err_desc+res.err_msg); } ); } function callpay() { if (typeof WeixinJSBridge == "undefined"){ if( document.addEventListener ){ document.addEventListener('WeixinJSBridgeReady', jsApiCall, false); }else if (document.attachEvent){ document.attachEvent('WeixinJSBridgeReady', jsApiCall); document.attachEvent('onWeixinJSBridgeReady', jsApiCall); } }else{ jsApiCall(); } } </script> </head> <body> <p> </p> <p> </p> <p align="center"> <table border="1"> <tr> <td>openID</td> <td><?php echo $openid;?></td> </tr> <tr> <td>商品名称</td> <td><?php echo $goods;?></td> </tr> <tr> <td>订单号</td> <td><?php echo $out_trade_no;?></td> </tr> <tr> <td>prepay_id</td> <td><?php echo $prepay_id;?></td> </tr> <tr> <td>价格</td> <td><?php echo $price;?></td> </tr> </table> <button data-theme="b" type="button" onclick="callpay()">贡献一下</button> </p> </body> </html>
1。コード
最新の SDK バージョンは V3.7 ですが、V3.7 のデモをダウンロードするのではなく (このサンプルは機能しません)、代わりに V3 のサンプルをダウンロードしてください:
pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
2。 Web ルート ディレクトリの下にあります。たとえば、圧縮パッケージを解凍した後のディレクトリは WxpayAPI_php_v3 です。このディレクトリに入り、すべてのファイルを選択して、プロジェクト ディレクトリにコピーする必要があります。このディレクトリにはindex.phpがあるため、テスト時にはxxx.sinaapp.com/index.phpにアクセスする必要があります。
3.index.php内のタグのURLアドレスをサーバー上のURLアドレスに変更します。
4. WeChat で会話ウィンドウを開き、index.php アドレス (xxx.sinaapp.com/index.php など) を入力し、会話ウィンドウ内のこのリンクをクリックします。いくつかのボタンが表示されます。「JSAPI Payment」ボタンをクリックすると、支払い金額が 1 セントのウィンドウが表示されます。荷受人を入力して支払います。支払い成功インターフェイスがポップアップ表示されます。
この時点で、基本的に公式の支払いコードが利用可能であることを意味します。次に、それをベースにして独自のコードに変更できます。
5. cert ディレクトリ内の apiclient_key.pem と apiclient_cert.pem を独自の証明書に置き換えます。
6. WxPay.Config.php の次の項目を独自のものに変更します:
const APPID //公众号中“开发者中心”看到的AppID const MCHID //微信支付商户资料审核成功邮件中的商户号 const KEY //你在商户平台中设置的支付key const APPSECRET //公众号中“开发者中心”看到的AppSecret
7. Sina の sae をテスト サーバーとして使用しているため、sae ではファイル io を直接書き込むことができないため、公式 Web サイトを追加できます。ファイル操作はそれに応じて変更されます (SaeStorage を使用)。つまり、log.php の CLogFileHandler クラスを変更する必要があります:
class CLogFileHandler implements ILogHandler { private $fn=null; private $ss=null; public function construct($file = '') { $this->fn=str_replace("../logs/", "", $file); $this->ss=new SaeStorage(); } public function write($msg) { $bytes = $this->ss->read('log', $this->fn); $str = $bytes; $this->ss->write('log', $this->fn, "$str\n$msg"); } public function destruct() { $fn=null; $ss=null; } }
8. 署名失敗のエラーが発生した場合は、WeChat の支払いインターフェイス デバッグ ツールを使用してテストできます: pay.weixin.qq.com/wiki /tools/signverify /.
このツールは「スキャンされた支払い」を検証するために使用されますが、「パラメータの追加」ボタンと「パラメータの削除」ボタンを使用して、「公式アカウントの支払い」のテストにも使用できます。たとえば、送信した XML の内容が次の場合 (ログ機能を使用して、送信した XML コンテンツを sae ストレージに保存し、ログ ファイルをダウンロードできます):
<xml><openid><![CDATA[om8888LTHBj99992Qgl_eUAOFgxs]]></openid><body><![CDATA[test]]></body><out_trade_no><![CDATA[wx111196222243ffa1143858aaaa]]></out_trade_no><total_fee>1</total_fee><notify_url><![CDATA[http://xxx.sinaapp.com/wxpay/demo/notify_url.php]]></notify_url><trade_type><![CDATA[JSAPI]]></trade_type><appid><![CDATA[wx000096104a431111]]></appid><mch_id>6666833333</mch_id><spbill_create_ip><![CDATA[10.211.76.107]]></spbill_create_ip><nonce_str><![CDATA[1agieoxyi8hc7e817rsnjlyn9lxmsnxj]]></nonce_str><sign><![CDATA[817034E4DE8E6067EB85CDF7318EF0A1]]></sign></xml>
次に、フォームに記入できます。テストツールは次のようになります:
「署名を生成」をクリックします。取得した署名とログ ファイル内の署名を比較して一貫性があるかどうかを確認すると、署名アルゴリズムの問題を排除できます。
2 つの署名が一致する場合、それは間違いなく支払いキーに問題があります。製品 MM が間違いを犯したか、AppSecret と支払いキーが逆になったかのどちらかです (製品 MM が間違った支払いキーを使用するように指示したことがあり、3 日間の時間を無駄にしました。バックグラウンドを設定した後、毎回すべてのコードを繰り返し確認しました)問題は支払いキーだったので、私は管理者ではなかったので、モバイル用の製品 MM にログインしました。電話認証コードと支払いキーをリセットすると、コードはワンクリックで機能します)
[関連する推奨事項]
1. WeChatパブリックアカウントプラットフォームのソースコードのダウンロード
2. WeChat公式アカウント開発におけるクレジットカード決済のチュートリアルを共有する
3. WeChat決済開発におけるクレジットカード決済のサンプルの詳細な説明
以上がWeChat開発のためのWeChat支払いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。