이번에는 WeChat 스캔 코드 결제를 위한 Asp.NetMVC 개발과 WeChat 스캔 코드 결제 Asp.Net MVC 개발을 위한 Notes가 무엇인지 살펴보겠습니다.
여기서 스캔코드 결제는 공식 모드 2인 위챗 결제를 PC사이트에서 이용하는 것을 의미합니다. 해당 사이트는 Asp.net MVC이며, 아래와 같이 구성되어 있습니다. (데모는 하단에 있습니다)
1. 준비
는 WeChat API의 통합 주문 방식을 사용합니다. 주요 매개변수는 '공개 계정 ID(appid)', '판매자 번호(mch_id)'입니다. 그리고 '가맹점 결제키(KEY)'가 있으므로 먼저 승인된 공용계좌를 보유하고 결제기능을 활성화한 후 가맹점에 신청하고, 심사를 통과하면 로그인인 가맹점번호를 받게 됩니다. 판매자 플랫폼의 이름입니다. 판매자 결제 키는 URL이 변조되지 않도록 서명하는 데 사용됩니다. 가맹점 플랫폼에 진입 후 API 보안을 32비트 string으로 설정합니다.
이 세 가지 매개 변수를 얻은 후 한 가지 더 주의할 점은거래 시작 시간과 거래 종료 시간 사이의 간격이 5분 이상 2시간 미만이어야 한다는 것입니다. 그렇지 않으면 결제 URL을 얻을 때 오류가 보고됩니다.
2. 결제 QR 코드 생성위의 매개변수를 사용하여 다음 단계는 SDK(.net SDK 및 예제)를 다운로드하는 것입니다. 안타깝게도 이 공식 예제는 처음에는 올바르게 실행되지 않았습니다. MVC 디렉터리에 대한 관련 dll을 참조합니다. 그리고 WxPayAPI 폴더를 생성하고 관련 클래스를 복사하세요.그런 다음
WxPayConfig의 관련 매개변수를 자신의 매개변수로 설정한 다음 GetPayUrl 메소드를 수정합니다.
public string GetPayUrl(Order order,string ip) { if (order == null) { throw new ArgumentNullException("order"); } var product = order.OrderItems.First(); WxPayData data = new WxPayData(); data.SetValue("appid", WxPayConfig.APPID); data.SetValue("mch_id", WxPayConfig.MCHID); // data.SetValue("device_info", "iphone4s"); data.SetValue("nonce_str", WxPayApi.GenerateNonceStr()); data.SetValue("body", product.AttributeDescription);//商品描述 data.SetValue("detail", product.AttributeDescription);//商品描述 data.SetValue("attach", "北京分店");//附加数据 data.SetValue("out_trade_no", order.TradeNumber);//随机字符串 // data.SetValue("total_fee", Convert.ToInt32(order.OrderTotal * 100));//总金额 data.SetValue("total_fee", 1);//总金额 data.SetValue("spbill_create_ip",ip);//总金额 data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));//交易起始时间 data.SetValue("time_expire", DateTime.Now.AddMinutes(30).ToString("yyyyMMddHHmmss"));//交易结束时间 data.SetValue("goods_tag", "智能婴儿床");//商品标记 data.SetValue("notify_url", "http://www.xxxx.com/Checkout/ResultNotify");//通知地址 data.SetValue("trade_type", "NATIVE");//交易类型 data.SetValue("product_id", product.ProductId);//商品ID data.SetValue("sign", data.MakeSign());//签名 Logger.Info("获得签名" + data.GetValue("sign")); WxPayData result = WxPayApi.UnifiedOrder(data);//调用统一下单接口 Logger.Info(result.ToJson()); string url = result.GetValue("code_url").ToString();//获得统一下单接口返回的二维码链接 Logger.Info("pay url:" + url); return url; }
controller에서 결제 수단을 생성하세요. QR 코드를 표시하는 데 사용됩니다.
ActionResult Payment(( ArgumentException( order = _orderService.GetOrderByGuid( user == url2 == +=
<img src="@ViewBag.QRCode" class="qrcode" />
public FileResult MakeQRCode(string data) { if (string.IsNullOrEmpty(data)) throw new ArgumentException("data"); //初始化二维码生成工具 QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(); qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE; qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M; qrCodeEncoder.QRCodeVersion = 0; qrCodeEncoder.QRCodeScale = 4; //将字符串生成二维码图片 Bitmap image = qrCodeEncoder.Encode(data, Encoding.Default); //保存为PNG到内存流 MemoryStream ms = new MemoryStream(); image.Save(ms, ImageFormat.Jpeg); return File(ms.ToArray(), "image/jpeg"); }
public ActionResult ResultNotify() { //接收从微信后台POST过来的数据 Stream s = Request.InputStream; int count = 0; byte[] buffer = new byte[1024]; StringBuilder builder = new StringBuilder(); while ((count = s.Read(buffer, 0, 1024)) > 0) { builder.Append(Encoding.UTF8.GetString(buffer, 0, count)); } s.Flush(); s.Close(); s.Dispose(); Logger.Info(this.GetType()+ "Receive data from WeChat : " + builder); //转换数据格式并验证签名 WxPayData data = new WxPayData(); try { data.FromXml(builder.ToString()); } catch (WxPayException ex) { //若签名错误,则立即返回结果给微信支付后台 WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", ex.Message); Log.Error(this.GetType().ToString(), "Sign check error : " + res.ToXml()); Response.Write(res.ToXml()); Response.End(); } Logger.Info(this.GetType()+ "Check sign success"); ProcessNotify(data); return View(); } public void ProcessNotify(WxPayData data) { WxPayData notifyData = data; //检查支付结果中transaction_id是否存在 if (!notifyData.IsSet("transaction_id")) { //若transaction_id不存在,则立即返回结果给微信支付后台 WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "支付结果中微信订单号不存在"); Logger.Error(this.GetType()+"The Pay result is error : " + res.ToXml()); Response.Write(res.ToXml()); Response.End(); } string transaction_id = notifyData.GetValue("transaction_id").ToString(); //查询订单,判断订单真实性 if (!QueryOrder(transaction_id)) { //若订单查询失败,则立即返回结果给微信支付后台 WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "订单查询失败"); Logger.Error(this.GetType()+"Order query failure : " + res.ToXml()); Response.Write(res.ToXml()); Response.End(); } //查询订单成功 else { WxPayData res = new WxPayData(); res.SetValue("return_code", "SUCCESS"); res.SetValue("return_msg", "OK"); Logger.Info(this.GetType()+"order query success : " + res.ToXml()); SetPaymentResult(data.GetValue("out_trade_no").ToString(), PaymentStatus.Paid); Response.Write(res.ToXml()); Response.End(); } }
public void SetPaymentResult(string tradeno, PaymentStatus status) { Logger.Info("订单号:"+tradeno); var order = _orderService.GetOrderByTradeNumber(tradeno); if (order != null) { order.PaymentStatus = status; if (status == PaymentStatus.Paid) { order.PaidDate = DateTime.Now; } _orderService.UpdateOrder(order); Logger.Info("订单:"+tradeno+"成功更新状态为"+status); } }
H5 동영상 재생 라이브러리 video.js 상세 설명
위 내용은 WeChat 스캔 코드 결제를 위한 Asp.Net MVC 개발의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!