C\#MVC 위 챗 결제 튜 토리 얼 시리즈 의 공중 번호 지불 코드
26043 단어 asp.netmvc위 챗 페 이 먼 트
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().
이 방법 은 이미 제 가 삭 제 했 습 니 다.용 도 는 우리 가 사용자 의 돈 을 받 은 후에 우 리 는 데이터 베 이 스 를 동기 화 시 켜 야 하기 때문에 어떻게 조작 해 야 하 는 지 스스로 수정 하 는 것 입 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
작업 중 문제 해결 - (win 2003 asp. net) Session 과 페이지 전송 방법 으로 해결 방안 을 정상적으로 사용 할 수 없습니다.또한 F 는 처음에 우리 의 BP & IT 프로젝트 팀 이 Forms 폼 검증 을 사용 했다 고 판단 할 수 있 습 니 다. 페이지 를 뛰 어 넘 는 것 은http://hr.bingjun.cc/MyTask/MyTas...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.