Heim  >  Artikel  >  WeChat-Applet  >  WeChat-Zahlungsentwicklung – Senparc.Weixin.MP ausführliche Erklärung

WeChat-Zahlungsentwicklung – Senparc.Weixin.MP ausführliche Erklärung

高洛峰
高洛峰Original
2017-02-13 13:14:203319Durchsuche

Offizielles Konto + WeChat-Zahlungs-SDK: Senparc.Weixin.MP.dll

Unternehmenskonto-SDK: Senparc.Weixin.QY.dll

Offene Plattform-SDK: Senparc.Weixin.Open. dll

Offizielle Adresse: http://weixin.senparc.com/

Um die Entwicklung der WeChat-Zahlungsfunktion des offiziellen Kontos abzuschließen, müssen wir natürlich die DLL Senparc verwenden .Weixin.MP.dll, ich habe die offizielle DEMO und die Tutorials überprüft, aber es gibt keine Anweisungen zur WeChat-Zahlung. Jetzt, da ich den Quellcode habe, kann ich ihn selbst finden.

Öffnen Sie Senparc.Weixin.MP.sln. Anhand der Klassifizierung der englischen Ordnernamen können wir zunächst beurteilen, dass die WeChat-Zahlung im TenPayLib-Ordner gekapselt ist, aber ich habe auch festgestellt, dass es eine Datei mit dem Namen „ TenPayLibV3-Ordner, wie wählt man ihn aus? Nach einer Online-Suche bin ich zu folgendem Schluss gekommen: Bei den vor dem 10. September 2014 angewendeten Versionen handelt es sich um Version v2, bei denen, die danach angewendet wurden, um Version v3. Das Dienstkonto, mit dem ich WeChat Pay getestet habe, wurde erst 2016 beantragt und hat die Verifizierung bestanden, also verwenden Sie unbedingt V3.

Öffnen Sie den TenPayLibV3-Ordner:

微信支付开发-Senparc.Weixin.MP详解

Hier finden Sie mehrere Klassenbibliotheken. Was macht jede einzelne? Wir werden sie hier nicht einzeln beschreiben. Der Dateikopf jeder Kategorie enthält eine Funktionsbeschreibung und eine Beschreibung. Wir werden die Zahlung direkt starten.

Geben Sie das offizielle WeChat-Konto ein, klicken Sie im Funktionsmenü auf WeChat-Zahlung und klicken Sie entsprechend auf das Tutorial – offizielle Kontozahlung

微信支付开发-Senparc.Weixin.MP详解 微信支付开发-Senparc.Weixin.MP详解

Überprüfen Sie schnell die Dokumentinhalt Überprüfen und durchsuchen Sie, um die entsprechenden Funktionen in Senparc.Weixin.MP.dll zu finden.

微信支付开发-Senparc.Weixin.MP详解

Konfigurieren Sie zunächst das Zahlungsautorisierungsverzeichnis und fügen Sie eine Zahlungstest-Whitelist hinzu. Es werden nur drei Zahlungsverzeichnisse unterstützt und der Domainname muss ICP-registriert sein. Die Funktion des Autorisierungsverzeichnisses besteht darin, dass sich die angeforderte Linkadresse im Autorisierungsverzeichnis befinden muss, wenn Sie eine WeChat-Zahlungsanfrage initiieren möchten. Andernfalls ist die Identität ungültig und die Zahlung kann nicht erfolgreich sein. Nur die zur Test-Whitelist hinzugefügte persönliche WeChat-ID kann den Zahlungstest im WeChat-Zahlungstestverzeichnis abschließen. Wenn eine Person, die nicht auf der Whitelist steht, einen Zahlungsantrag initiiert, ist die Zahlung nicht erfolgreich.

Wie kann ich die Konfiguration aufrufen, nachdem sie abgeschlossen ist? Schauen wir uns weiterhin die offizielle Beschreibung an: H5-Aufruf-Zahlungs-API 

„Öffnen Sie die H5-Webseite im WeChat-Browser und führen Sie JS aus, um die Zahlung aufzurufen. Das Eingabe- und Ausgabedatenformat der Schnittstelle ist JSON 🎜>

Hinweis: Integrierte Objekte von WeixinJSBridge sind in anderen Browsern ungültig

 Parameternamen in der Liste sind größenabhängig und die Signaturüberprüfung schlägt fehl, wenn die Groß- und Kleinschreibung falsch ist > OK, hier sind ein paar Dinge zu erklären, zweitens muss bei den Parametern zwischen Groß- und Kleinschreibung unterschieden werden;

Offizielle Beschreibung: Solange das folgende Skript auf der Seite aufgerufen wird, kann die WeChat-Zahlungsfunktion aktiviert werden:

Mein Anrufcode: Weil ich nach dem Klicken auf anrufen möchte Klicken Sie auf die Schaltfläche, um die Zahlung zu bestätigen. WeChat Pay führt nachfolgende Vorgänge aus und fügt den offiziellen Code in die Methode ein.

function onBridgeReady(){
   WeixinJSBridge.invoke(
       'getBrandWCPayRequest', {
           "appId" : "wx2421b1c4370ec43b",     //公众号名称,由商户传入     
           "timeStamp":" 1395712654",         //时间戳,自1970年以来的秒数     
           "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串     
           "package" : "prepay_id=u802345jgfjsdfgsdg888",     
           "signType" : "MD5",         //微信签名方式:     
           "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名 
       },
       function(res){     
           if(res.err_msg == "get_brand_wcpay_request:ok" ) {}     // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回    ok,但并不保证它绝对可靠。 
       }
   ); 
}
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{
   onBridgeReady();
}

Okay, woher kommen diese Parameter und was sind sie? Analysieren wir sie einzeln:

function onBridgeReady() {
            WeixinJSBridge.invoke(
                'getBrandWCPayRequest', {
                    "appId": $('#APPID').val(),     //公众号名称,由商户传入     
                    "timeStamp": $('#Timestamp').val(),         //时间戳,自1970年以来的秒数     
                    "nonceStr": $('#Noncestr').val(), //随机串     
                    "package": $('#package').val(),
                    "signType": "MD5",         //微信签名方式:     
                    "paySign": $('#paySign').val() //微信签名 
                },
                function (res) {
                    if (res.err_msg == "get_brand_wcpay_request:ok") {
                        //支付成功,后续自行处理
                        
                    }
                    else
                    {
                        //支付取消,或者其他错误,自行处理
                    }
                }
            );
        }
appId: Jeder, der WeChat entwickelt, sollte das wissen. Den offiziellen Account finden Sie im Entwicklermenü

timeStamp: Zeitstempel, die offizielle Beschreibung lautet „seit 1970“. „Sekunden“, keine Sorge, Sie können es definitiv in der Zahlungsbibliothek finden

nonceStr: Die offizielle Erklärung ist die zufällige Zeichenfolge „e61463f8efa94090b1f366cccfbbb444“. Weitere Informationen finden Sie im Algorithmus zur Zufallszahlengenerierung. Es stellt sich heraus, dass es sich um eine Reihe von Verschlüsselungsregeln und -algorithmen handelt. Freunde, die URL-Anforderungsschnittstellen erstellt haben, sollten wissen, dass die JSON-String-Signaturmethoden einiger Unternehmen diesen ähneln.

Paket: Vorauszahlungs-ID, die durch Aufrufen der offiziellen einheitlichen API-Bestellschnittstelle abgerufen werden kann

signType: Zeichenfolge „MD5“

paySign: Die offizielle Erklärung ist die WeChat-Signatur „70EA570631E4BB79628FBCA90534C63FF7FADD89“, okay, ich habe es ertragen und einen Blick auf den Signaturgenerierungsalgorithmus geworfen. Er scheint einer Zufallszeichenfolge zu ähneln

Zu diesem Zeitpunkt wurde die offizielle Schnittstellenbeschreibung sehr klar verstanden Der nächste Schritt besteht darin, das Problem des WeChat-Aufrufs zu lösen. Wie soll ich diese Zahlungsparameter über Senparc.Weixin.MP.dll verwenden? Da wir zuerst die einheitliche Bestellschnittstelle aufrufen müssen, um die Prepaid-Bestell-ID zu erhalten, wollen wir zunächst untersuchen, wie wir diese ID erhalten.

  官方给出了详细说明,我们不在赘述,各参数研究按照上述接口的方式自行研究解决,唯一区别在于,调用官方接口需要传入一个XML,那很好办,拼接一下就可以了,预支付调用方法如下:

//这里通过官方的一个实体,用户自行使用,我这里是直接读取的CONFIG文件
private static Senparc.Weixin.MP.TenPayLibV3.TenPayV3Info tenPayV3Info = new Senparc.Weixin.MP.TenPayLibV3.TenPayV3Info(ConfigurationManager.AppSettings["corpId"], ConfigurationManager.AppSettings["corpSecret"], ConfigurationManager.AppSettings["mch_id"]
                    , ConfigurationManager.AppSettings["key"], ConfigurationManager.AppSettings["v3url"]);

        /// <summary>
        /// 微信预支付
        /// </summary>
        /// <param name="attach"></param>
        /// <param name="body"></param>
        /// <param name="openid"></param>
        /// <param name="price"></param>
        /// <param name="orderNum"></param>
        /// <returns></returns>
        public static string PayInfo(string attach, string body, string openid, string price, string orderNum = "1833431773763549")
        {
            RequestHandler requestHandler = new RequestHandler(HttpContext.Current);
            //微信分配的公众账号ID(企业号corpid即为此appId)
            requestHandler.SetParameter("appid", tenPayV3Info.AppId);
            //附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
            requestHandler.SetParameter("attach", attach);
            //商品或支付单简要描述
            requestHandler.SetParameter("body", body);
            //微信支付分配的商户号
            requestHandler.SetParameter("mch_id", tenPayV3Info.MchId);
            //随机字符串,不长于32位。
            requestHandler.SetParameter("nonce_str", TenPayUtil.GetNoncestr());
            //接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。
            requestHandler.SetParameter("notify_url", tenPayV3Info.TenPayV3Notify);
            //trade_type=JSAPI,此参数必传,用户在商户公众号appid下的唯一标识。
            requestHandler.SetParameter("openid", openid);
            //商户系统内部的订单号,32个字符内、可包含字母,自己生成
            requestHandler.SetParameter("out_trade_no", orderNum);
            //APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP。
            requestHandler.SetParameter("spbill_create_ip", "127.0.0.1");
            //订单总金额,单位为分,做过银联支付的朋友应该知道,代表金额为12位,末位分分
            requestHandler.SetParameter("total_fee", price);
            //取值如下:JSAPI,NATIVE,APP,我们这里使用JSAPI
            requestHandler.SetParameter("trade_type", "JSAPI");
            //设置KEY
            requestHandler.SetKey(tenPayV3Info.Key);

            requestHandler.CreateMd5Sign();
            requestHandler.GetRequestURL();
            requestHandler.CreateSHA1Sign();
            string data = requestHandler.ParseXML();
            requestHandler.GetDebugInfo();

            //获取并返回预支付XML信息
            return TenPayV3.Unifiedorder(data);
        }
    }

好的,拿到预支付订单的返回数据,一切又都好办了,根据返回参数的不同,自行解决,我们只关心调用正确的过程,操作继续,在返回的正确XML数据中,我们获取到了 88a638634f96c4d5385af75458953c57be5c8d72abc5b0647c20ab3ed87e8a806688e7ad0e17c5b2c6aa450a6c842cf4(官方示例),好的,开始在页面做支付吧!

这里,我封装了一个实体,用来传输常用的数据,当然,各位也可以参考Senparc.Weixin.MP.dll提供的实体类。

public class ShareInfo
    {
        string corpId = string.Empty;
        public string CorpId
        {
            get { return corpId; }
            set { corpId = value; }
        }
        string ticket = string.Empty;

        public string Ticket
        {
            get { return ticket; }
            set { ticket = value; }
        }
        string noncestr = string.Empty;

        public string Noncestr
        {
            get { return noncestr; }
            set { noncestr = value; }
        }
        string timestamp = string.Empty;

        public string Timestamp
        {
            get { return timestamp; }
            set { timestamp = value; }
        }

        private string paySign = string.Empty;
        public string PaySign
        {
            get { return paySign; }
            set { paySign = value; }
        }

        private string package = string.Empty;

        public string Package
        {
            get { return package; }
            set { package = value; }
        }
    }

我们继续,来看一下支付接口需要用到的参数如何获取:

public static ShareInfo GetPayInfo(string prepayid)
        {
            shareInfo = new ShareInfo();
            //检查是否已经注册jssdk
            if (!JsApiTicketContainer.CheckRegistered(corpId))
            {
                JsApiTicketContainer.Register(corpId, corpSecret);
            }
            JsApiTicketResult jsApiTicket = JsApiTicketContainer.GetTicketResult(corpId);
            JSSDKHelper jssdkHelper = new JSSDKHelper();
            shareInfo.Ticket = jsApiTicket.ticket;
            shareInfo.CorpId = corpId.ToLower();
            shareInfo.Noncestr = JSSDKHelper.GetNoncestr().ToLower();
            shareInfo.Timestamp = JSSDKHelper.GetTimestamp().ToLower();
            shareInfo.Package="prepay_id=" + prepayid.ToLower();

            RequestHandler requestHandler = new RequestHandler(HttpContext.Current);

            requestHandler.SetParameter("appId", shareInfo.CorpId);
            requestHandler.SetParameter("timeStamp", shareInfo.Timestamp);
            requestHandler.SetParameter("nonceStr", shareInfo.Noncestr);
            requestHandler.SetParameter("package", shareInfo.Package);
            requestHandler.SetParameter("signType", "MD5");

            requestHandler.SetKey(tenPayV3Info.Key);
            requestHandler.CreateMd5Sign();
            requestHandler.GetRequestURL();
            requestHandler.CreateSHA1Sign();
            shareInfo.PaySign = (requestHandler.GetAllParameters()["sign"]).ToString();
            return shareInfo;
        }

这样,支付接口需要用到的参数,就都封装在ShareInfo里了,好吧,调用之后,我们回到页面的后置代码中,或者你采用的ORM对应代码中去,将参数输出到页面

//处理页面支付调用信息
                    ShareInfo shareInfo = TenPayModule.GetPayInfo(prepayid);
                    System.Web.HttpContext.Current.Response.Write(string.Format("<input type=\"hidden\" id=\"Noncestr\" runat=\"server\" value=\"{0}\" />", shareInfo.Noncestr));
                    System.Web.HttpContext.Current.Response.Write(string.Format("<input type=\"hidden\" id=\"Timestamp\" runat=\"server\" value=\"{0}\" />", shareInfo.Timestamp));
                    System.Web.HttpContext.Current.Response.Write(string.Format("<input type=\"hidden\" id=\"APPID\" runat=\"server\" value=\"{0}\" />", shareInfo.CorpId));
                    System.Web.HttpContext.Current.Response.Write(string.Format("<input type=\"hidden\" id=\"paySign\" runat=\"server\" value=\"{0}\" />", shareInfo.PaySign));
                    System.Web.HttpContext.Current.Response.Write(string.Format("<input type=\"hidden\" id=\"package\" runat=\"server\" value=\"{0}\" />", shareInfo.Package));

好的,写到这里,大家参照上面的JS代码,就可以完成整个的支付功能了。最后,再附送一个生成商家订单号的方法,代码如下:

public string GetOrderNumber()
        {
            string Number = DateTime.Now.ToString("yyMMddHHmmss");
            return Number + Next(1000, 1).ToString();
        }
        private static int Next(int numSeeds, int length)
        {
            byte[] buffer = new byte[length]; 
            System.Security.Cryptography.RNGCryptoServiceProvider Gen = new System.Security.Cryptography.RNGCryptoServiceProvider();
            Gen.GetBytes(buffer);
            uint randomResult = 0x0; 
            for (int i = 0; i < length; i++)
            {
                randomResult |= ((uint)buffer[i] << ((length - 1 - i) * 8));
            }
            return (int)(randomResult % numSeeds);
        }

更多微信支付开发-Senparc.Weixin.MP详解 相关文章请关注PHP中文网!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn