.NETを利用してWeChat決済を解析する実装方法

高洛峰
リリース: 2017-03-17 15:21:34
オリジナル
1615 人が閲覧しました

WeChatの普及に伴い、WeChatをベースに開発された一連の製品も登場していますので、興味のある方はWeChat決済の実装方法を中心に紹介します。

少し前に WeChat 決済の Web バージョンを作成し、多くの問題に遭遇しましたが、最終的には解決されました。他の人に参考にしてもらうために、開発プロセスと手順をここに記録します。

1.準備

まず、WeChat決済機能を有効化する必要があります。以前はWeChat決済を有効化するには30,000のデポジットが必要でしたが、現在は必要なくなりましたので、この機能が実装されました。

WeChat 支払いを開発するには、公式アカウントのバックエンドと WeChat 販売者のバックエンドで関連する設定を行う必要があります。

1. 開発ディレクトリの設定

WeChat 決済では、公式アカウントのバックエンドに決済承認ディレクトリを設定する必要があります (WeChat 決済 = "開発設定")。ここでの承認されたディレクトリは、オンライン アドレス、つまり、インターネット経由でアクセスできるアドレスである必要があります。WeChat 支払いシステムは、インターネット経由であなたのアドレスにアクセスできる必要があります。

WeChat 承認ディレクトリは、第 2 レベルまたは第 3 レベルのディレクトリまで正確である必要があります。例: 支払いを開始するリンクが http://www.hxfspace.net/weixin/WeXinPay/WeXinPayChoose の場合、設定されたディレクトリは http: //www.hxfspace.net/weixin/WeXinPay/ ここで、http://www.hxfspace.net はドメイン名、weixin はコントローラーである WeXinPay です。関連する支払いリクエストはすべて アクション に含まれます。 WeXinPayで。 U a 2、OAUTH2.0ウェブページ認証ドメイン名設定

.NETを利用してWeChat決済を解析する実装方法 WeChat決済は決済リクエストに合わせて認証コード(CODE)を取得するため、ここで認証ドメイン名を設定する必要があります。もちろん、ここでのドメイン名は、支払い承認ディレクトリ内のドメイン名と同じである必要があります。これを設定するのを忘れないでください。私はそれを設定するのを忘れて、泣きながら原因を探して長い時間を費やしました。


3. 関連パラメータの準備

WeChat 支払いを呼び出すには、スクリプトを通じて WeChat 支払いシステムへの支払いリクエストが必要です。パラメータの説明については、.NETを利用してWeChat決済を解析する実装方法WeChat 公式 Web サイトの支払いプラットフォーム
https://pay.weixin を参照してください。 .qq.com/wiki /doc/api/jsapi.php?chapter=7_7&index=6


パッケージと paySign の生成には、開発者キー AppSecret (アプリケーション キー)、WeChat 販売アカウント、および WeChat 支払いキーが必要です

II、開発プロセス

.NETを利用してWeChat決済を解析する実装方法 早速、整理した後のプロセスについて説明します。

1. WeChat 認証コールバックを通じて認証コードを取得します

2. Web ページと引き換えに認証コードを使用します。 authorization access_token と openid

3 、統合注文インターフェイスを呼び出して prepayId を取得します

4. jsapi WeChat 支払いリクエスト パラメーターを設定し、支払いを開始します

5. 後続の操作で WeChat 支払いコールバックを受信します


3 . 具体的な開発 (上記のコード)


WeChat 決済はオンライン環境でのみ実行でき、調整が非常に不便であるため、開発時にすべての主要な場所でログを記録することが最善です。


1. WeChat 認証コールバックを通じて認証コードを取得します

まず、開始支払いアドレスと関連パラメーターを WeChat 支払いインターフェイスに渡します。WeChat 支払いが正常に受信され、確認された後、支払いアドレスが再要求されます。認証コード付き。

たとえば、私はここに reRroReee


String WeChat Web ページの承認された URL メソッド


 //判断是否网页授权,获取授权code,没有代表没有授权,构造网页授权获取code,并重新请求
      if (string.IsNullOrEmpty(Request.QueryString["code"]))
      {
        string redirectUrl = _weChatPaySerivce.GetAuthorizeUrl(account.AppId, account.RedquestUrl,
          "STATE" + "#wechat_redirect", "snsapi_base");
        return Redirect(redirectUrl);
      }
ログイン後にコピー


2 を使用し、最初のステップから Web ページの Access_token と Openid

を交換して、得る最初のステップから 認証コードを取得したら、Web ページの認証リクエスト URL を組み合わせて、access_token と openid を取得します


public string GetAuthorizeUrl(string appId, string redirectUrl, string state, string scope)
    {
      string url = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state={3}",
          appId, HttpUtility.UrlEncode(redirectUrl), scope, state);
      /* 这一步发送之后,客户会得到授权页面,无论同意或拒绝,都会返回redirectUrl页面。
       * 如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。这里的code用于换取access_token(和通用接口的access_token不通用)
       * 若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数redirect_uri?state=STATE
       */
      AppLog.Write("获取到授权url:", AppLog.LogMessageType.Debug); 
      return url;
    }
ログイン後にコピー


3. 統合注文インターフェイスを呼び出して、前払い ID を取得します

ここでは、 RequestHandler は他のオンライン DLL によってパッケージ化されており、署名の生成と一部​​の検証リクエストをカプセル化するのに役立ちます。 DLL は公式 Web サイト http://weixin.senparc.com/


 public Tuple<string, string> GetOpenidAndAccessTokenFromCode(string appId, string code, string appSecret)
    {
      Tuple<string, string> tuple = null;
      try
      {
        string url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", appId, appSecret, code);
        string result = WeChatPayHelper.Get(url);
        AppLog.Write("微信支付-获取openid和access_token 请求Url:" + url + "result:" + result, AppLog.LogMessageType.Debug);
        if (!string.IsNullOrEmpty(result))
        {
          var jd=Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(result);
          tuple = new Tuple<string, string>(jd["openid"],jd["access_token"]);
          AppLog.Write("微信支付-获取openid和access_token成功", AppLog.LogMessageType.Debug);
        }
      }
      catch (Exception ex)
      {
        AppLog.Write("微信支付:获取openid和access_tokenu异常", AppLog.LogMessageType.Debug,ex);
      }
      return tuple;
    }
ログイン後にコピー


からダウンロードできます。 4. jsapi WeChat 支払いリクエスト パラメーターを設定し、支払いを開始します

我这里是首先组装好微信支付所需要的参数,然后再创建调用js脚本


//生成JsAPI支付参数
      RequestHandler paySignReqHandler = new RequestHandler(null);
      paySignReqHandler.SetParameter("appId", account.AppId);
      paySignReqHandler.SetParameter("timeStamp", timeStamp);
      paySignReqHandler.SetParameter("nonceStr", nonceStr);
      paySignReqHandler.SetParameter("package", string.Format("prepay_id={0}", prepayId));
      paySignReqHandler.SetParameter("signType", "MD5");
      string paySign = paySignReqHandler.CreateMd5Sign("key", account.PaySignKey);
      WeChatJsPayRequestModel resultModel = new WeChatJsPayRequestModel
      {
        AppId = account.AppId,
        NonceStr = nonceStr,
        TimeStamp = timeStamp,
        Package = string.Format("prepay_id={0}", prepayId),
        PaySign = paySign,
        SignType = "MD5"
      };
ログイン後にコピー


创建调用脚本


private string CreateWeixinJs(WeChatJsPayRequestModel model)
    {
      string js = @"<script type=&#39;text/javascript&#39;>
                callpay();
                function jsApiCall(){
                 WeixinJSBridge.invoke(
                  &#39;getBrandWCPayRequest&#39;, {
                    requestParam
                  },
                  function (res) {
                    if(res.err_msg == &#39;get_brand_wcpay_request:ok&#39; ){
                        window.location.href = &#39;successUrl&#39;;
                    }else{
                        window.location.href = &#39;failUrl&#39;;
                    }
                  }
                 ); 
                }
               function callpay()
                {
                  if (typeof WeixinJSBridge == &#39;undefined&#39;){
                    if( document.addEventListener ){
                      document.addEventListener(&#39;WeixinJSBridgeReady&#39;, jsApiCall, false);
                    }else if (document.attachEvent){
                      document.attachEvent(&#39;WeixinJSBridgeReady&#39;, jsApiCall); 
                      document.attachEvent(&#39;onWeixinJSBridgeReady&#39;, jsApiCall);
                    }
                  }else{
                    jsApiCall();
                  }
                }
            </script>";
      string requestParam = string.Format(@"&#39;appId&#39;: &#39;{0}&#39;,&#39;timeStamp&#39;: &#39;{1}&#39;,&#39;nonceStr&#39;: &#39;{2}&#39;,&#39;package&#39;: &#39;{3}&#39;,&#39;signType&#39;: &#39;{4}&#39;,&#39;paySign&#39;: &#39;{5}&#39;",
        model.AppId, model.TimeStamp, model.NonceStr, model.Package, model.SignType, model.PaySign);
      js = js.Replace("requestParam", requestParam)
        .Replace("successUrl", model.JumpUrl + "&result=1")
        .Replace("failUrl", model.JumpUrl + "&result=0");
      AppLog.Write("生成可执行脚本成功", AppLog.LogMessageType.Debug);
      return js;
    }
ログイン後にコピー


5、接收微信支付回调进行后续操作

回调的时候首先需要验证签名是否正确,保证安全性,签名验证通过之后再进行后续的操作,订单状态、通知啥的。


ResponseHandler resHandler = new ResponseHandler(System.Web.HttpContext.Current);
      bool isSuccess = _weChatPaySerivce.ProcessNotify(resHandler);
      if (isSuccess)
      {
        string result = @"<xml>
                  <return_code><![CDATA[SUCCESS]]></return_code>
                  <return_msg><![CDATA[支付成功]]></return_msg>
                 </xml>";
        HttpContext.Response.Write(result);
        HttpContext.Response.End();
      }
      return new EmptyResult();
ログイン後にコピー


这里有一点需要注意,就是微信支付回调的时候微信会通知八次,好像是这个数吧,所以你需要在第一次收到通知之后,把收到请求这个状态以xml的格式响应给微信支付接口。当然你不进行这个操作也是可以的,再回调的时候 每次去判断该订单是否已经回调成功,回调成功则不进行处理就可以了。


以上が.NETを利用してWeChat決済を解析する実装方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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