C\#MVC 위 챗 결제 튜 토리 얼 시리즈 의 공중 번호 지불 코드

오늘 우 리 는 이어서 위 챗 결제 의 시리즈 강 좌 를 이야기 했다.앞에서 우 리 는 이 위 챗 보너스 와 스 캔 결 제 를 이야기 했다.지금,우 리 는 이 공중전화 지불 에 대해 이야기 합 시다.공중전화 결제 의 응용 환경 에서 흔히 볼 수 있 는 사용 자 는 공중전화 번 호 를 통 해 공중전화 안의 메뉴 링크 를 통 해 공중전화 상점 에 들 어간 다음 에 그 안에서 구 매 와 결제 기능 을 완성 한다.우 리 는 정부 가 이 공중전화 결제 장면 에 대한 설명 을 볼 수 있다.체인 연결:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1이 공식 적 인 설명 을 통 해그럼 우 리 는 이 공중전화 의 용 도 를 대충 알 고 있 습 니 다.다음은 이 공중전화 로 지불 할 준비 작업 이 어떤 것 이 있 는 지 말씀 드 리 겠 습 니 다.
 1.위 챗 웹 개발 자 도구 다운로드,도구 사용 방식,링크 보기,주소:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1455784140&token=&lang=zh_CN
  2."위 챗 결제"환경 설정,다음 그림:

3.사용자 정 보 를 얻 을 수 있 는 권한 을 부여 합 니 다.다음 그림:

 다음 부터 한 걸음 한 걸음 내 려 갑 니 다.
 1.우 리 는 먼저 프로그램 을 개발 합 니 다.먼저 MVC 프로젝트(asp.net 을 새로 만 들 면 공식 적 으로 주 는 demo 는 asp.net 입 니 다.다운로드 하여 참고 할 수 있 습 니 다.https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1이름 은 위 챗 결제 의 공중 번호 지불 입 니 다.다음 과 같 습 니 다.
 
그리고 오른쪽 단 추 를 누 르 면 속성 을 수정 합 니 다.다음 그림:
 
그 다음 에 우 리 는 프로그램 이 자동 으로 생 성 된 HomeController.cs 와 View 안의 것 을 삭제 하고 HomeController.cs 를 새로 만 들 고 View 를 추가 합 니 다.코드 는 다음 과 같 습 니 다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Web.Controllers
{
 public class HomeController : Controller
 {
  // GET: Home
  public ActionResult Index()
  {
   return View();
  }
 }
} 
보기 코드:

@{
 Layout = null;
}

<!DOCTYPE html>

<html>
<head>
 <meta name="viewport" content="width=device-width" />
 <title>Index</title>
</head>
<body>
 <div> 
 </div>
</body>
</html>
네,맞아요.아직 비어 있어 요.지금부터 프론트 데스크 를 쓰 겠 습 니 다.코드 는 다음 과 같 습 니 다.

@{
 Layout = null;
}

<!DOCTYPE html>

<html>
<head>
 <meta name="viewport" content="width=device-width" />
 <title>      </title>
 <link href="~/Scripts/jquery-easyui-1.4.5/themes/bootstrap/easyui.css" rel="stylesheet" />
 <link href="~/Scripts/jquery-easyui-1.4.5/themes/mobile.css" rel="stylesheet" />
 <link href="~/Scripts/jquery-easyui-1.4.5/themes/icon.css" rel="stylesheet" />
 <style type="text/css">
  body{
   margin:0;
   padding:0;
  }
  .logo {
   width: 100%;
   height: 70px;
   background: url(/Images/EleLogo.png) 0 0 no-repeat;
   background-size: 100% 100%;
   padding: 0;
   margin: 0;
  }

  .line {
   width: 100%;
   float: left;
   height: auto;
   text-align: center;
   margin-top: 10px;
  }

  .lineText {
   width: 100%;
   float: left;
   height: auto;
   text-indent: 5%;
   text-align: left;
   font-size: x-large;
   margin: 0;
  }

  .function {
   height: 60pt;
   line-height: 60pt;
   width: 45%;
   float: left;
   border-radius: 10px;
   background-color: #990000;
   margin-left: 8pt;
  }

  .title {
   font-family: "    ";
   font-size: x-large;
   color: white;
  }

  a {
   text-decoration: none;
   color: white;
  }

  input {
   vertical-align: central;
  }

  label {
   vertical-align: central;
  }

  .lbBlock {
   border: 1px solid #808080;
   background-color: grey;
   width: 90%;
   margin-left: 5%;
   font-size: x-large;
   border-radius: 10px;
   text-align: left;
   text-indent: 10pt;
   height: 30pt;
   padding-top: 5pt;
  }

  .btn {
   width: 90%;
   height: 35pt;
   font-size: x-large;
   background-color: #990000;
   color: white;
   background: url(/Images/red.png) 0 0 repeat;
   border: none;
   border-radius: 10px;
   margin: 10px 0 0 0;
  }

  .input {
   height: 30pt;
   width: 90%;
   font-size: x-large;
   border-radius: 10px;
   margin: 0;
   padding: 0;
  }
 </style>

</head>
<body>
 <div class="logo">
 </div>
 <form id="ChargeForm">  
  <div class="line">
   <div class="lineText">
        :
   </div>
  </div>
  <div class="line">
   <input type="number" id="ChargeVal" name="ChargeVal" class="input" placeholder="  : " />
  </div>  
 </form>
 <div class="line">
  <input type="button" class="btn" value="    " onclick="fCharge()" style="margin-top: 20px;" />
 </div>
 <div class="line">
  <input type="button" id="btnHome" class="btn" value="    " onclick="fBackHome()" />
 </div>
 <script src="~/Scripts/jquery-easyui-1.4.5/jquery.min.js"></script>
 <script src="~/Scripts/jquery-easyui-1.4.5/jquery.easyui.min.js"></script>
 <script src="~/Scripts/jquery-easyui-1.4.5/jquery.easyui.mobile.js"></script>
 <script src="~/Scripts/jquery-easyui-1.4.5/easyloader.js"></script>
 <script type="text/javascript">
  $(function () {
   var vCode = getQueryString("code");
   if (vCode != "" && vCode != null) {
    //alert(vCode);
    $.ajax({
     type: 'post',
     data: {
      code: vCode
     },
     url: '/Home/getWxInfo',
     success: function (sjson) {
      //alert(sjson);
      //var vData = JSON.stringify(sjson);
      //alert(vData);
      $.messager.show({
       title: '  ',
       msg: '            。'
      });
     }
    })
   }
   else {
    $.ajax({
     type: 'post',
     url: '/Home/getCode',
     success: function (sjson) {
      //alert(sjson);
      location.href = sjson;
     }
    })
   }
  })
  //  url   
  function getQueryString(name) {
   var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
   var r = window.location.search.substr(1).match(reg);
   if (r != null) return unescape(r[2]); return null;
  }





  //         
  function fCharge() {
   if (typeof WeixinJSBridge == "undefined") {
    if (document.addEventListener) {
     document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
    } else if (document.attachEvent) {
     document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
     document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
    }
   } else {
    fPostCharge();
   }
  }
  //      
  function fPostCharge() {
   var vChargeVal = $("#ChargeVal").val();
   vChargeVal = parseFloat(vChargeVal);
   if (vChargeVal > 0) {
    $.messager.progress({
     title: "",
     msg: "          ,   ..."
    });
    $.ajax({
     type: "post",
     data: "totalfee=" + vChargeVal,
     url: "/Home/MeterRecharge",
     success: function (json) {
      $.messager.progress('close');//    
      //var json = eval("(" + msg + ")");//    JSON  
      onBridgeReady(json);
     },
     error: function () {
      $.messager.progress('close');//    
      $.messager.alert("  ", '          ,     。', 'info')
     }
    })
   }
   else {
    alert("                   ,      .")
   }
  }
  //        
  function onBridgeReady(json) {
   WeixinJSBridge.invoke(
   'getBrandWCPayRequest', {
    "appId": json.appId,  //     ,     
    "timeStamp": json.timeStamp,   //   , 1970      
    "nonceStr": json.nonceStr, //   
    "package": json.packageValue,
    "signType": "MD5",   //      :
    "paySign": json.paySign //    
   },
   function (res) {
    if (res.err_msg == "get_brand_wcpay_request:ok") {
     //alert("    ,       ,    ,      .");
     fAlreadyPay();
    }  //             ,        :res.err_msg            ok,          。
   }
   );
  }
  function fBackHome() {
   location.href = "/";
  }
 </script>
</body>
</html>
배경 코드 는 다음 과 같 습 니 다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Web.Models;
using WxPayAPI;

namespace Web.Controllers
{
 public class HomeController : Controller
 {
  JsApiPay jsApiPay = new JsApiPay();
  // GET: Home
  public ActionResult Index()
  {
   if (Session["openid"] == null)
   {
    try
    {
     //  【          】       openid access_token
     GetOpenidAndAccessToken();

    }
    catch (Exception ex)
    {
     //Response.Write(ex.ToString());
     //throw;
    }
   }
   return View();
  }


  /**
  * 
  *                  
  *                  :http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html
  *    :  url    code
  *    :  code   openid access_token
  * 
  */
  public void GetOpenidAndAccessToken()
  {
   if (Session["code"] != null)
   {
    //  code ,   openid access_token
    string code = Session["code"].ToString();
    Log.Debug(this.GetType().ToString(), "Get code : " + code);
    jsApiPay.GetOpenidAndAccessTokenFromCode(code);
   }
   else
   {
    //        code URL
    string host = Request.Url.Host;
    string path = Request.Path;
    string redirect_uri = HttpUtility.UrlEncode("http://" + host + path);
    //string redirect_uri = HttpUtility.UrlEncode("http://gzh.lmx.ren");
    WxPayData data = new WxPayData();
    data.SetValue("appid", WxPayConfig.APPID);
    data.SetValue("redirect_uri", redirect_uri);
    data.SetValue("response_type", "code");
    data.SetValue("scope", "snsapi_base");
    data.SetValue("state", "STATE" + "#wechat_redirect");
    string url = "https://open.weixin.qq.com/connect/oauth2/authorize?" + data.ToUrl();
    Log.Debug(this.GetType().ToString(), "Will Redirect to URL : " + url);
    Session["url"] = url;    
   }
  }


  /// <summary>
  ///   code
  /// </summary>
  /// <returns></returns>
  [HttpPost]
  public ActionResult getCode()
  {
   object objResult = "";
   if (Session["url"] != null)
   {
    objResult = Session["url"].ToString();
   }
   else
   {
    objResult = "url  。";
   }
   return Json(objResult);
  }

  /// <summary>
  ///   code      access_token openid     
  /// </summary>
  /// <returns></returns>
  [HttpPost]
  public ActionResult getWxInfo()
  {
   object objResult = "";
   string strCode = Request.Form["code"];
   if (Session["access_token"] == null || Session["openid"] == null)
   {
    jsApiPay.GetOpenidAndAccessTokenFromCode(strCode);
   }
   string strAccess_Token = Session["access_token"].ToString();
   string strOpenid = Session["openid"].ToString();
   objResult = new { openid = strOpenid, access_token = strAccess_Token };
   return Json(objResult);
  }




  /// <summary>
  ///   
  /// </summary>
  /// <returns></returns>
  [HttpPost]
  public ActionResult MeterRecharge()
  {
   object objResult = "";
   string strTotal_fee = Request.Form["totalfee"];
   string strFee = (double.Parse(strTotal_fee) * 100).ToString();

   //        ,        ,             
   jsApiPay.openid = Session["openid"].ToString();
   jsApiPay.total_fee = int.Parse(strFee);

   //JSAPI     
   try
   {
    string strBody = "        ";//    
    WxPayData unifiedOrderResult = jsApiPay.GetUnifiedOrderResult(strBody);
    WxPayData wxJsApiParam = jsApiPay.GetJsApiParameters();//  H5  JS API  ,  ,        demo   ,        string ,  ,            ,      

    ModelForOrder aOrder = new ModelForOrder()
    {
     appId = wxJsApiParam.GetValue("appId").ToString(),
     nonceStr = wxJsApiParam.GetValue("nonceStr").ToString(),
     packageValue = wxJsApiParam.GetValue("package").ToString(),
     paySign = wxJsApiParam.GetValue("paySign").ToString(),
     timeStamp = wxJsApiParam.GetValue("timeStamp").ToString(),
     msg = "    ,        ."
    };
    objResult = aOrder;
   }
   catch (Exception ex)
   {
    ModelForOrder aOrder = new ModelForOrder()
    {
     appId = "",
     nonceStr = "",
     packageValue = "",
     paySign = "",
     timeStamp = "",
     msg = "    ,   ,    ,      ."
    };
    objResult = aOrder;
   }
   return Json(objResult);
  }


 }
} 

여기 가 바로 위 에서 수정 한 코드 입 니 다.어린이 신발 들 주의 하 세 요.

  /**
  * 
  *                       jsapi       ,
  *        JSAPI          :
  * {
  * "appId" : "wx2421b1c4370ec43b",  //     ,       
  * "timeStamp":" 1395712654",   //   , 1970        
  * "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //     
  * "package" : "prepay_id=u802345jgfjsdfgsdg888",  
  * "signType" : "MD5",   //      : 
  * "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //     
  * }
  * @return string        JSAPI      ,json          
  *                 API:http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7
  * 
  */
  public WxPayData GetJsApiParameters()
  {
   Log.Debug(this.GetType().ToString(), "JsApiPay::GetJsApiParam is processing...");

   WxPayData jsApiParam = new WxPayData();
   jsApiParam.SetValue("appId", unifiedOrderResult.GetValue("appid"));
   jsApiParam.SetValue("timeStamp", WxPayApi.GenerateTimeStamp());
   jsApiParam.SetValue("nonceStr", WxPayApi.GenerateNonceStr());
   jsApiParam.SetValue("package", "prepay_id=" + unifiedOrderResult.GetValue("prepay_id"));
   jsApiParam.SetValue("signType", "MD5");
   jsApiParam.SetValue("paySign", jsApiParam.MakeSign());

   string parameters = jsApiParam.ToJson();
   Log.Debug(this.GetType().ToString(), "Get jsApiParam : " + parameters);
   return jsApiParam;
  }

Model ForOrder 클래스 의 코드:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Web.Models
{
 public class ModelForOrder
 {
  public string appId { get; set; }
  public string timeStamp { get; set; }
  public string nonceStr { get; set; }
  public string packageValue { get; set; }
  public string paySign { get; set; }

  public string msg { get; set; }
 }
} 

또 한 가지 주의해 야 할 점 이 있 습 니 다.수정 한 것 은 바로 여기 WxLib/business/JSApiBay.cs 입 니 다.다음 그림 입 니 다.

마지막 으로 프로그램 을 발표 합 니 다.이번 에는 웹 을http://gzh.lmx.ren에 발표 한 다음 에 인터페이스 권한 을 다음 과 같이 바 꿉 니 다.다음 그림:

 
이 안의 도 메 인 이름 은 위 에서 발표 한 도 메 인 이름과 일치 해 야 합 니 다. 
그 밖 에 우 리 는 이곳 을 고 쳐 야 한다.

바로 반드시 이곳 에 권한 을 부여 해 야 한다.그렇지 않 으 면 지불 할 때 다른 오 류 를 제시 할 것 이다.구체 적 으로 나 는 테스트 하지 않 을 것 이다.
또한,여 기 는 사실 이 공중 번호 의 지불 절 차 를 완 료 했 습 니 다.그러나 우리 페이지 에 서 는 친절 한 알림(사실은 우호 적 이지 않 습 니 다.힌트 는 빨간색 입 니 다.머리 에 비밀 번 호 를 입력 하지 마 십시오)을 할 것 입 니 다.이것 은 우리 가 이http://gzh.lmx.ren도 메 인 이름 을 안전 도 메 인 이름 으로 설정 하지 않 았 기 때 문 입 니 다.설정 한 후에 알림 을 하지 않 을 것 입 니 다.설정 방법 은 다음 그림 과 같 습 니 다:

이 안에 우리 도 메 인 이름 을 넣 으 면 완벽 해...
 나의 코드 는 가능 한 한 간소화 하고 나머지 는 내 가 모두 버 릴 것 이다.바로 사람들의 이목 을 헷 갈 리 게 하지 않 기 위해 서 이다.코드 안에 잘 모 르 는 것 이 있 으 면 개인 적 으로 나 에 게 물 어보 거나 단체 에서 나 에 게 물 어 볼 수 있 습 니 다.군 호 는 문장 끝 에 있 습 니 다.
 이제 나 는 내 위의 방법 을 하나하나 설명 하기 시작 했다.
우선 백 엔 드 에서 페이지 를 불 러 올 때 먼저 실행 합 니 다.

public ActionResult Index()
  {
   if (Session["openid"] == null)
   {
    try
    {
     //  【          】       openid access_token
     GetOpenidAndAccessToken();

    }
    catch (Exception ex)
    {
     //Response.Write(ex.ToString());
     //throw;
    }
   }
   return View();
  } 

 이 안 은 사용자 의 Openid 와 Access 를 얻 기 위 한 것 입 니 다.token,이 용 도 는 매우 크다.그리고 우 리 는 코드 를 통 해 알 수 있다.우 리 는 이 방법 을 통 해 위 챗 의 관련 정 보 를 얻 을 수 있다.얻 은 후에 그 는 우리 의 페이지 로 돌아 올 것 이다.url 은 하나의 session 안에 존재 한다.다음 과 같다.
 Session["url"] = url;       
이어서 앞에서:
페이지 로 딩 이 완료 되면 다음 JS 방법 을 실행 합 니 다.다음 과 같 습 니 다.
 

 $(function () {
   var vCode = getQueryString("code");
   if (vCode != "" && vCode != null) {
    //alert(vCode);
    $.ajax({
     type: 'post',
     data: {
      code: vCode
     },
     url: '/Home/getWxInfo',
     success: function (sjson) {
      //alert(sjson);
      //var vData = JSON.stringify(sjson);
      //alert(vData);
      $.messager.show({
       title: '  ',
       msg: '            。'
      });
     }
    })
   }
   else {
    $.ajax({
     type: 'post',
     url: '/Home/getCode',
     success: function (sjson) {
      //alert(sjson);
      location.href = sjson;
     }
    })
   }
  }) 
그 는 브 라 우 저의 url 을 먼저 가 져 온 다음 에 code 를 가 져 옵 니 다.일반 url 뒤의 xxx.com 입 니까?code=xxx 입 니 다.이 안 에는 code 가 있 는 지 없 는 지 먼저 판단 하 는 것 입 니 다.code 가 없 으 면 배경 으로 가서 이 code 를 요청 합 니 다.이 코드 를 왜 요 청 했 을까요?이 방법 을 살 펴 보 겠 습 니 다:getWxInfo,다음 그림:

/// <summary>
  ///   code
  /// </summary>
  /// <returns></returns>
  [HttpPost]
  public ActionResult getCode()
  {
   object objResult = "";
   if (Session["url"] != null)
   {
    objResult = Session["url"].ToString();
   }
   else
   {
    objResult = "url  。";
   }
   return Json(objResult);
  } 
그 는 url 을 전단 으로 되 돌려 줍 니 다.전단 은 js 를 통 해 그 주 소 를 방문 합 니 다.그 주 소 는 바로 위 챗 에서 우리 의 정 보 를 얻 은 후에 우리 에 게 규칙 에 따라 url 을 되 돌려 줍 니 다.이 rul 은 바로 우리 가 뒤에 가 야 할 code 의 url 입 니 다.이 코드 는 우리 에 게 매우 중요 합 니 다.왜냐하면 뒤에 우 리 는 지불 과 관련 된 일 을 해 야 하기 때문에 모두 사용 합 니 다.code 가 있어 야 openid 와 access 를 얻 을 수 있 습 니 다.token。구체 적 으로 코드 논 리 를 보면 알 수 있다.
자,여기까지 왔 습 니 다.openid 와 access 를 알 고 있 습 니 다.token 입 니 다.이 럴 때 우 리 는 전단 의 물건 을 처리 하 는 것 을 책임 집 니 다.
전단 에 저 는 금액 입력 상자 에 있 습 니 다.그 다음 에 제출 하 겠 습 니 다.실제 응용 에서 우 리 는 반드시 상품 의 인 자 를 입력 해 야 합 니 다.저 는 이 안에 남 은 것 을 쓰 지 않 고 나중에 당신들 이 직접 넣 으 면 됩 니 다.이 안 에는 제출 을 클릭 할 때 위 챗 환경 을 호출 하여 아래 코드 를 봅 니 다.

 //         
  function fCharge() {
   if (typeof WeixinJSBridge == "undefined") {
    if (document.addEventListener) {
     document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
    } else if (document.attachEvent) {
     document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
     document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
    }
   } else {
    fPostCharge();
   }
  } 

그 는 환경 을 초기 화 할 것 입 니 다.초기 화 에 성공 하면 이 페이지 가 위 챗 클 라 이언 트 에서 실 행 됩 니 다.그러면 우 리 는 그 에 게 우리 의 진정한 충전 코드 를 실행 하여 제출 할 것 입 니 다.그래서 다음 과 같이 실 행 됩 니 다.fPost Charge().
제출 한 후에 백 스테이지 에 들 어 갈 것 입 니 다.백 스테이지 에 서 는 우리 프론트 데스크 에 필요 한 인 자 를 구성 해 야 합 니 다.그 중에서 다음 과 같 습 니 다.

/// <summary>
  ///   
  /// </summary>
  /// <returns></returns>
  [HttpPost]
  public ActionResult MeterRecharge()
  {
   object objResult = "";
   string strTotal_fee = Request.Form["totalfee"];
   string strFee = (double.Parse(strTotal_fee) * 100).ToString();

   //        ,        ,             
   jsApiPay.openid = Session["openid"].ToString();
   jsApiPay.total_fee = int.Parse(strFee);

   //JSAPI     
   try
   {
    string strBody = "        ";//    
    WxPayData unifiedOrderResult = jsApiPay.GetUnifiedOrderResult(strBody);
    WxPayData wxJsApiParam = jsApiPay.GetJsApiParameters();//  H5  JS API  

    ModelForOrder aOrder = new ModelForOrder()
    {
     appId = wxJsApiParam.GetValue("appId").ToString(),
     nonceStr = wxJsApiParam.GetValue("nonceStr").ToString(),
     packageValue = wxJsApiParam.GetValue("package").ToString(),
     paySign = wxJsApiParam.GetValue("paySign").ToString(),
     timeStamp = wxJsApiParam.GetValue("timeStamp").ToString(),
     msg = "    ,        ."
    };
    objResult = aOrder;
   }
   catch (Exception ex)
   {
    ModelForOrder aOrder = new ModelForOrder()
    {
     appId = "",
     nonceStr = "",
     packageValue = "",
     paySign = "",
     timeStamp = "",
     msg = "    ,   ,    ,      ."
    };
    objResult = aOrder;
   }
   return Json(objResult);
  } 

우리 가 주로 제공 해 야 할 것 은 바로 이 모델 ForOrder 안의 매개 변 수 를 프론트 데스크 에 되 돌려 서 호출 하 는 것 입 니 다.다음 과 같 습 니 다.

 //        
  function onBridgeReady(json) {
   WeixinJSBridge.invoke(
   'getBrandWCPayRequest', {
    "appId": json.appId,  //     ,     
    "timeStamp": json.timeStamp,   //   , 1970      
    "nonceStr": json.nonceStr, //   
    "package": json.packageValue,
    "signType": "MD5",   //      :
    "paySign": json.paySign //    
   },
   function (res) {
    if (res.err_msg == "get_brand_wcpay_request:ok") {
     //alert("    ,       ,    ,      .");
     fAlreadyPay();
    }  //             ,        :res.err_msg            ok,          。
   }
   );
  } 
이렇게 하면 그 는 위 챗 결제 창 을 팝 업 할 것 이다.다음 과 같다.
 
그리고 우 리 는 지불 을 확인 한 후에 지불 이 성공 적 인지 여 부 를 확인 합 니 다.만약 지불 이 성공 한다 면 우 리 는 실행 하고 있 습 니 다:fAlreadyPay().
이 방법 은 이미 제 가 삭 제 했 습 니 다.용 도 는 우리 가 사용자 의 돈 을 받 은 후에 우 리 는 데이터 베 이 스 를 동기 화 시 켜 야 하기 때문에 어떻게 조작 해 야 하 는 지 스스로 수정 하 는 것 입 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기