微信支付-原生支付(Native)-模式一


業務流程:

     商戶后台系統根據微信支付規則鏈接生成二維碼,鏈接中帶固定參數productid(可定義為產品標識或訂單號)。用戶掃碼后,微信支付系統將productid和用戶openid(用戶標識)回調商戶后台系統,商戶后台系統根據productid生成支付交易,最后微信支付系統發起用戶支付流程。

步驟一:設置回調URL

1. 在微信公眾平台設置支付權限,進入欄目微信支付-》開發配置-》修改

2. 進入修改頁面后,找到公眾號支付-》Native原生支付,勾選Native原生支付開通該權限,在支付回調URL上填寫商戶支付后台系統的網頁地址。

用戶掃碼之后,微信服務器會將相關的數據Post到這個url。

步驟二:生成二維碼

        public JsonResult GetQrCode(string no)
        {

            string productId = no;

            string timeStamp = Senparc.Weixin.MP.TenPayLibV3.TenPayV3Util.GetTimestamp();
            string nonceStr = Senparc.Weixin.MP.TenPayLibV3.TenPayV3Util.GetNoncestr();

            Senparc.Weixin.MP.TenPayLibV3.RequestHandler QrReqHandler = new Senparc.Weixin.MP.TenPayLibV3.RequestHandler(null);

            QrReqHandler.SetParameter("appid", AppId);
            QrReqHandler.SetParameter("mch_id", MchId);
            QrReqHandler.SetParameter("time_stamp", timeStamp);
            QrReqHandler.SetParameter("nonce_str", nonceStr);
            QrReqHandler.SetParameter("product_id", productId);

            string sign = QrReqHandler.CreateMd5Sign("key", Key);

            QrReqHandler.SetParameter("sign", sign);

            string long_url = Senparc.Weixin.MP.AdvancedAPIs.TenPayV3.NativePay(AppId, timeStamp, MchId, nonceStr, productId, sign);
           
            nonceStr = Senparc.Weixin.MP.TenPayLibV3.TenPayV3Util.GetNoncestr();

            Senparc.Weixin.MP.TenPayLibV3.RequestHandler ShortUrlReqHandler = new Senparc.Weixin.MP.TenPayLibV3.RequestHandler(null);

            ShortUrlReqHandler.SetParameter("appid", AppId);
            ShortUrlReqHandler.SetParameter("mch_id", MchId);
            ShortUrlReqHandler.SetParameter("long_url", long_url);
            ShortUrlReqHandler.SetParameter("nonce_str", nonceStr);

            string ShortSign = ShortUrlReqHandler.CreateMd5Sign("key", Key);

            ShortUrlReqHandler.SetParameter("sign", ShortSign);

            string ShortData = ShortUrlReqHandler.ParseXML();

            var ShortUrlResult = Senparc.Weixin.MP.AdvancedAPIs.TenPayV3.ShortUrl(ShortData);

            var res = System.Xml.Linq.XDocument.Parse(ShortUrlResult);

            string short_url = res.Element("xml").Element("short_url").Value;
                        
            //ThoughtWorks.QRCode.Codec.QRCodeEncoder encoder = new ThoughtWorks.QRCode.Codec.QRCodeEncoder();
            //encoder.QRCodeEncodeMode = ThoughtWorks.QRCode.Codec.QRCodeEncoder.ENCODE_MODE.BYTE;//編碼方式(注意:BYTE能支持中文,ALPHA_NUMERIC掃描出來的都是數字)
            //encoder.QRCodeScale = 4;//大小(值越大生成的二維碼圖片像素越高)
            //encoder.QRCodeVersion = 0;//版本(注意:設置為0主要是防止編碼的字符串太長時發生錯誤)
            //encoder.QRCodeErrorCorrect = ThoughtWorks.QRCode.Codec.QRCodeEncoder.ERROR_CORRECTION.M;//錯誤效驗、錯誤更正(有4個等級)
            //System.Drawing.Bitmap bp = encoder.Encode(short_url, Encoding.GetEncoding("GB2312"));

            //bp.Save(@"D:\QrCode\" + productId + ".jpg");

            //url = @"D:\QrCode\" + productId + ".jpg";
  
            string url = "http://qr.liantu.com/api.php?text=" + short_url; //生成二維碼

            return Json(url);
        }

步驟三:回調Url獲取數據並生成訂單,調用統一下單生成預支付訂單,將數據回傳給微信服務器。微信服務器調用支付讓用戶完成支付。

        public ActionResult NativeCallBack()
        {

            Senparc.Weixin.MP.TenPayLibV3.ResponseHandler NativeCallBackRepHandler = new Senparc.Weixin.MP.TenPayLibV3.ResponseHandler(null);

            string re_appid = NativeCallBackRepHandler.GetParameter("appid");
            string re_openid = NativeCallBackRepHandler.GetParameter("openid");
            string re_mchid = NativeCallBackRepHandler.GetParameter("mch_id");
            string re_is_subscribe = NativeCallBackRepHandler.GetParameter("is_subscribe");
            string re_nonce_str = NativeCallBackRepHandler.GetParameter("nonce_str");
            string re_product_id = NativeCallBackRepHandler.GetParameter("product_id");
            string re_sign = NativeCallBackRepHandler.GetParameter("sign");

            string nonceStr = Senparc.Weixin.MP.TenPayLibV3.TenPayV3Util.GetNoncestr();
            string body = "Test-Native-Model1";//商品或支付單簡要描述
            string out_trade_no = re_product_id;//商戶系統內部的訂單號,32個字符內,可包含字母,其他說明見商戶訂單號
            int total_fee = 2;//Convert.ToInt32(trade.TRADE_PAYMENT.Value*100);//訂單總金額,只能是整數。
            string spbill_create_ip = Request.UserHostAddress;//APP和網頁支付提交用戶端IP,Native支付填調用微信支付API的機器IP
            string notify_url = "http://×××/PayNotifyUrl";//接收微信支付異步通知回調地址
            string trade_type = "NATIVE";//JSAPI,NATIVE,APP,WAP

            //創建支付應答對象
            Senparc.Weixin.MP.TenPayLibV3.RequestHandler packageReqHandler = new Senparc.Weixin.MP.TenPayLibV3.RequestHandler(null);
            //初始化
            packageReqHandler.Init();

            //設置package訂單參數
            packageReqHandler.SetParameter("appid", AppId);
            packageReqHandler.SetParameter("mch_id", MchId);
            packageReqHandler.SetParameter("nonce_str", nonceStr);
            packageReqHandler.SetParameter("body", body);
            packageReqHandler.SetParameter("out_trade_no", out_trade_no);
            packageReqHandler.SetParameter("total_fee", total_fee.ToString());
            packageReqHandler.SetParameter("spbill_create_ip", spbill_create_ip);
            packageReqHandler.SetParameter("notify_url", notify_url);
            packageReqHandler.SetParameter("trade_type", trade_type);
            packageReqHandler.SetParameter("product_id", re_product_id);

            string sign = packageReqHandler.CreateMd5Sign("key", Key);

            packageReqHandler.SetParameter("sign", sign);

            string data = packageReqHandler.ParseXML();

            var UnifiedorderResult = Senparc.Weixin.MP.AdvancedAPIs.TenPayV3.Unifiedorder(data);
            var res = System.Xml.Linq.XDocument.Parse(UnifiedorderResult);

            string prepayId = res.Element("xml").Element("prepay_id").Value;

            Senparc.Weixin.MP.TenPayLibV3.RequestHandler returnreqHandler = new Senparc.Weixin.MP.TenPayLibV3.RequestHandler(null);

            returnreqHandler.SetParameter("return_code", "SUCCESS");
            returnreqHandler.SetParameter("result_code", "SUCCESS");
            returnreqHandler.SetParameter("appid", AppId);
            returnreqHandler.SetParameter("mch_id", MchId);
            returnreqHandler.SetParameter("nonce_str", re_nonce_str);
            returnreqHandler.SetParameter("prepay_id", prepayId);

            string returnsign = returnreqHandler.CreateMd5Sign("key", Key);

            returnreqHandler.SetParameter("sign", returnsign);

            string xml = returnreqHandler.ParseXML();

            return Content(xml, "text/xml");
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM