WeChat 스캔 코드 결제를 위한 Asp.Net MVC 개발

php中世界最好的语言
풀어 주다: 2018-03-16 13:47:47
원래의
2158명이 탐색했습니다.

이번에는 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;
        }
로그인 후 복사
TradeNumber는 WxPayApi.GenerateOutTradeNo() 메소드를 호출하여 생성되며, inform_url은 WeChat 알림 주소입니다. 사용자가 지불한 후. 금액의 단위는 cents이며, int형으로만 전달할 수 있고, Decimal형으로 변환해야 합니다. 성공적으로 URL을 획득한 후 결제를 담당하는

controller에서 결제 수단을 생성하세요. QR 코드를 표시하는 데 사용됩니다.

  ActionResult Payment((  ArgumentException( order = _orderService.GetOrderByGuid( user ==  url2 ==  +=
로그인 후 복사
이것은 페이지의 URL을 반환합니다.

<img src="@ViewBag.QRCode" class="qrcode"  />
로그인 후 복사
백그라운드에서 사용되는 qrCodeEncoder는 QR 코드를 생성합니다.

  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");
        }
로그인 후 복사
성공 후 결제 페이지 가져오기:

코드를 스캔하면 결제 페이지가 나타납니다.

3. 콜백

사용자가 결제한 후 WeChat은 이전에 예약된 인터페이스( 인터페이스는 매개변수를 가질 수 없음) 메시지를 받은 후 웹사이트에서 확인하고 확인 후 WeChat에 메시지를 보냅니다. 자세한 매개변수 및 문서는 공식 API를 참조하세요

여기에서는 데모의 메서드를 약간 수정하여 컨트롤러에 넣었습니다.

  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);
            }
        }
로그인 후 복사
그런 다음 페이지 상태에서 주문을 감지하고 성공을 확인한 후 페이지로 이동합니다.

판매자 플랫폼의 백엔드에서 다음을 쿼리할 수 있습니다.

이 기사의 사례를 읽은 후 방법을 마스터했다고 생각합니다. 더 흥미로운 정보를 보려면 다음 페이지의 다른 관련 기사에 주목하세요. PHP 중국어 웹사이트!

추천 도서:

WeChat 결제 환불 기능 개발

H5 동영상 재생 라이브러리 video.js 상세 설명

조명 제어를 위한 WeChat 하드웨어 H5 개발

JS의 특히 사용하기 쉬운 경량 날짜 플러그인

위 내용은 WeChat 스캔 코드 결제를 위한 Asp.Net MVC 개발의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!