WeidianがWeChat決済PHP版を統合する際に発生するさまざまな問題の記録

WBOY
リリース: 2016-06-23 13:41:14
オリジナル
904 人が閲覧しました

会社のプロジェクトのニーズにより、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 は臭くて長いです。アンパサンドが多く、認識できません。 どの部分が独自の URL ですか? 最も重要な部分は、822 行目あたりに、createOauthUrlForCode($redirectUrl) というメソッドがあります。この中の $url 変数は URL エンコードされていません。自分で追加しないと、URL のパラメーターが正常に認識されません。

$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();	}
ログイン後にコピー
posXml メソッドを確認したところ、独自の createXml メソッドが呼び出されていることがわかりました

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;	}
ログイン後にコピー
openid の形式がこれに似ている必要があることに特に注意してください。すべて数字またはすべて文字の場合は、間違っているはずです

。その後、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 つ追加しただけです。元のコードが多すぎるので、このように追加しました。

この変革が完了した後、私が遭遇した問題はすべて解決されました。これを読んでいる方のお役に立てれば幸いです。まだご質問がある場合は、メッセージを残してください。


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