会社のプロジェクトのニーズにより、WeChat 支払いをプロジェクトに統合する必要があります。会社の元のプロジェクトにはすでに古いバージョンの支払い機能が含まれていますが、ここでは説明しません。私がしなければならないのは、プロジェクトが新旧バージョンの両方の機能をサポートできるように、新バージョン
の支払い機能を追加することだけです。 WeChat 公式 Web サイトから新しいバージョンの支払い php バージョン SDK をダウンロードすると、WxPay.ub.config.php、SDKRuntimeException.php、WxPayPubHelper.php
の 3 つのファイルが表示されました。変換する必要があるのは、WxPayPubHelper.php ファイルです。このファイルは単一ユーザー用に構成されているため、変換プロセス中にいくつかの問題に遭遇しました
。他の人に役立つことを願って、私がここで遭遇したことを共有します。
q1: Redirect_uri パラメーター エラーの問題!
この問題は、比較的大きな割合で発生します。SDK パッケージには、js_api_call.php ファイルが含まれるデモ フォルダーがあり、その 13 行目に次のコードがあります。 redirect_uri を設定する パラメーターについては、独自のアドレスに変更しました。コードは次のとおりです。なぜそれを使用する必要があるのでしょうか? Base64 エンコードについてはどうですか。私の URL は次のようなものです:
index.php?g=Wap&m=Wxpay&a=newpay&token=$1&wecha_id=$2&orderid=$3
$url = urlencode($redirectUrl); それだけです。
上記の設定を行っても redirect_uri エラーが発生する場合は、支払いパスの権限の問題を考慮する必要があります。WeChat 公式アカウントのバックエンドを入力し、それがサービス アカウントであり、認証されていることを確認してください。閲覧方法はページ右上です。確認したら、左側のメニューで [デベロッパー センター] をクリックし、図に示すように:
[変更] をクリックし、[認証コールバック ページのドメイン名] を入力します。このドメイン名が使用しているものと一致していることを確認してください。アプリケーションのドメイン名を変更すると、この問題が解決されるはずです。
q2: prepay_id が取得できない問題
第一候補として、WxPayPubHelper.php ファイル内の UnifiedOrder_pub クラスの getPrepayId メソッドが正常に使用できることを確認してください。
このメソッドのコードは次のとおりです:
//使用jsapi接口 $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(); }
postXml メソッドは次のとおりです:
$url = $jsApi->createOauthUrlForCode(WxPayConf_pub::JS_API_CALL_URL);
このとき、 $xml 変数が次の形式であることを確認する必要があります:
/** * 获取prepay_id */ function getPrepayId() { $this->postXml(); $this->result = $this->xmlToArray($this->response); $prepay_id = $this->result["prepay_id"]; return $prepay_id; }
。その後、postXmlCurl を正しく送信でき、送信後、正しい prepay_id を取得できます
q3: prepay_id を取得した後、支払いを行うときに、次のプロンプトが表示されます: 公式アカウントの支払いでは無効な販売者番号が使用されています
この問題これは、2 回目の署名が最初の署名と一致しないため、ほとんどの場合発生します。原因は
この時点では、WxPayPubHelper.php ファイルの JsApi_pub クラスを確認する必要があります。このクラスの getParameters メソッドがキーです。 2 番目の署名へのコードは次のとおりです:
/** * 作用:post请求xml */ function postXml() { $xml = $this->createXml(); $this->response = $this->postXmlCurl($xml,$this->url,$this->curl_timeout); return $this->response; }
データ テーブルのデータを追跡する必要があるため、キーを動的に呼び出すように設定されているため、コードの変更は次のとおりです。
<xml><openid><![CDATA[o-aubjtEkotIj_GNXXXXqV8_XXXXX]]></openid><body>201501201705551389</body><out_trade_no><![CDATA[wx7143c4a87a86c8ac142174XXX]]></out_trade_no><total_fee>1</total_fee><notify_url><![CDATA[http://demo.com/paydemo/demo/notify_url.php]]></notify_url><trade_type><![CDATA[JSAPI]]></trade_type><appid><![CDATA[wx7143c4axxxxxxxx]]></appid><mch_id>10020230</mch_id><spbill_create_ip><![CDATA[192.168.1.110]]></spbill_create_ip><nonce_str><![CDATA[imfgrg1g2odbl6mbiacmlkxxxxxxx]]></nonce_str><sign><![CDATA[CBE62F36806A3E1D98CB2311XXXXXX]]></sign></xml>
getSign メソッドのプロトタイプは投稿されなくなりました。 変更点は次のとおりです:
/** * 作用:设置jsapi的参数 */ public function getParameters() { $jsApiObj["appId"] = WxPayConf_pub::APPID; $timeStamp = time(); $jsApiObj["timeStamp"] = "$timeStamp"; $jsApiObj["nonceStr"] = $this->createNoncestr(); $jsApiObj["package"] = "prepay_id=$this->prepay_id"; $jsApiObj["signType"] = "MD5"; $jsApiObj["paySign"] = $this->getSign($jsApiObj); $this->parameters = json_encode($jsApiObj); return $this->parameters; }
ご覧のとおり、ダメージを与えたくなかったため、パラメータと判定を 1 つ追加しただけです。元のコードが多すぎるので、このように追加しました。
この変革が完了した後、私が遭遇した問題はすべて解決されました。これを読んでいる方のお役に立てれば幸いです。まだご質問がある場合は、メッセージを残してください。