Bei der Anwendung von WeChat ist die WeChat-Zahlung ein relativ nützlicher Teil, aber es ist auch ein relativ komplizierter technischer Punkt. In einer Zeit, in der das WeChat-Geschäft sehr beliebt ist, erscheint es unvernünftig, dass der eigene Shop keine WeChat-Zahlung hinzufügt. Die WeChat-Zahlung ist darauf ausgelegt, der Mehrheit der WeChat-Benutzer und -Händler bessere Zahlungsdienste zu bieten. Das Zahlungs- und Sicherheitssystem von WeChat wird von Tencent Tenpay unterstützt. In diesem Artikel wird hauptsächlich die Implementierung des WeChat-Zahlungszugriffs, der WeChat-Zahlungs-API-Kapselung und API-Aufrufe auf offiziellen WeChat-Konten vorgestellt, um einige unserer allgemeinen Geschäftsanrufe zu realisieren.
Die WeChat-Zahlung ist die Grundlage für die Authentifizierung öffentlicher WeChat-Konten, d Informationen und Durchführung Zur Abstimmung und Überprüfung werden Sie in der Regel telefonisch kontaktiert, um die relevanten Informationen zu bestätigen.
Bevor wir mit der Nutzung der WeChat-Zahlungs-API beginnen, müssen wir im Allgemeinen bestimmte Konfigurationen im Hintergrund durchführen. Beispielsweise müssen wir das Autorisierungsverzeichnis für die offizielle Kontozahlung konfigurieren. Testen Sie die Whitelist und andere Informationen sowie die vom QR-Code-Scanning unterstützte Rückrufverarbeitungsadresse (diese Implementierung wird später erläutert), wie unten gezeigt.
Bevor wir die API verwenden, müssen wir wissen, dass für einige wichtige Vorgänge auf WeChat, wie Rückerstattungen, Bestellstornierungen usw., Zertifikate erforderlich sind, und für regelmäßige Zahlungsvorgänge Wir benötigen außerdem Informationen wie die Händlernummer, den Händler-Zahlungsschlüssel usw. Diese Zertifikate und Schlüsselinformationen erhalten wir von der Händlerplattform von WeChat Pay. Nachdem WeChat Pay aktiviert und genehmigt wurde, können wir uns bei der Händlerplattform anmelden, um entsprechende Leistungen zu erbringen Operationen.
Zuerst müssen wir das Zertifikat auf dem Entwicklungscomputer installieren.
Dann müssen Sie den geheimen API-Schlüssel festlegen
Laden Sie abschließend das Zertifikat auf der [API-Sicherheit] herunter. Projekt für unsere Entwicklung Umweltnutzung.
WeChat-Zahlungskonfigurationsbezogene Parameter und Erhalt von Zertifikaten, API-Schlüsseln und Händlern Nach Erhalt Anhand der Informationen wie der Kontonummer können wir beginnen, die spezifische Verwendung der WeChat-Zahlungs-API zu verstehen. Wir müssen die API zunächst zur Verwendung in eine C#-Klassenbibliothek kapseln, damit sie in verschiedenen Anwendungen problemlos aufgerufen werden kann.
WeChat-Zahlung ist in viele Methoden unterteilt, wie z. B. Scan-Code-Zahlung, offizielle Kontozahlung, JSAPI-Zahlung, APP-Zahlung usw. Die Kern-APIs sind jedoch ähnlich und decken im Wesentlichen die APIs im folgenden Screenshot ab. Es gibt nur einige Schnittstellenunterschiede.
Wir können anhand der Scan-Code-Zahlung beginnen, dies zu verstehen. Dies ist das Szenario des Scannens des QR-Codes zum Bezahlen, das in Modus eins und Modus zwei unterteilt ist.
Die Zahlung per Scancode kann in zwei Modi unterteilt werden, und Händler können den entsprechenden Modus entsprechend dem Zahlungsszenario auswählen.
[Modus 1]: Das Backend-System des Händlers generiert einen QR-Code basierend auf dem WeChat-Zahlungsregellink mit einem festen Parameter „productid“ (kann als Produktidentifikation oder Bestellnummer definiert werden) im Link. Nachdem der Benutzer den Code gescannt hat, ruft das WeChat-Zahlungssystem die Produkt-ID und die eindeutige Kennung des Benutzers (OpenID) an das Backend-System des Händlers zurück (die Zahlungsrückruf-URL muss auf der Grundlage der Produkt-ID festgelegt werden). , und schließlich leitet das WeChat-Zahlungssystem den Benutzerzahlungsprozess ein.
[Modus 2]: Das Backend-System des Händlers ruft WeChat Pay [Unified Order API] auf, um eine Prepaid-Transaktion zu generieren, und generiert einen QR-Code aus dem von der Schnittstelle zurückgegebenen Link. Der Benutzer scannt den Code und gibt zum Abschluss das Passwort ein der Zahlungsvorgang. Hinweis: Die Prepaid-Bestellung ist in diesem Modus 2 Stunden gültig und eine Zahlung nach Ablauf ist nicht mehr möglich.
Gemäß der API-Beschreibung der Scancode-Zahlung können wir diese Schnittstellen (z. B. einheitliche Auftragserteilung, Bestellanfrage, Bestellabschluss, Rückerstattungsantrag, Rückerstattungsanfrage, Kontoauszugsdownload usw.) einzeln kapseln Es ist praktisch für unsere Entwicklung und Verwendung.
Sowohl Modus eins als auch Modus zwei müssen die einheitliche Bestellschnittstelle verwenden und dann den entsprechenden QR-Code generieren, den die Kunden scannen und bezahlen können Wir. Schauen wir uns zunächst die Schnittstellenbeschreibung der einheitlichen Bestellung an, um deren spezifische Verwendung zu verstehen 🎜>
Mit Ausnahme des gescannten Zahlungsszenarios ruft das Händlersystem diese Schnittstelle zunächst zum Generieren auf Eine Vorauszahlungstransaktionsbestellung im WeChat-Zahlungsdiensthintergrund gibt die korrekte Vorauszahlungstransaktions-Antwort-ID zurück und drückt dann die Scan-Taste. JSAPI, APP und andere verschiedene Szenarien generieren Transaktionszeichenfolgen, um die Zahlung einzuleiten.
2) Schnittstellenlink
URL-Adresse: https ://api.mch.weixin.qq.com/pay/unifiedorder
3) Ob ein Zertifikat erforderlich ist
Nicht erforderlich
Der Aufruf der WeChat-Zahlungsschnittstelle unterscheidet sich vom Aufruf anderer Schnittstellen des offiziellen Kontos. Der gesamte Austausch erfolgt hier über XML, was sich nicht so bequem und flexibel anfühlt wie JSON. Im Folgenden finden Sie die einheitliche Bestellschnittstelle zum Übermitteln von Daten.
Die zurückgegebenen Daten sind ebenfalls XML, wie im folgenden Beispielcode gezeigt, und der Feldinhalt ist noch nicht sicher. Verwenden Sie daher, wie von der offiziellen Website empfohlen, ein Wörterbuch Sammlung. Speichert das zurückgegebene Datenobjekt.
3. WeChat-Zahlungs-APIC#-Kapselung und Aufruf
Basierend auf der obigen Beschreibung haben wir ein allgemeines Verständnis von WeChat Zahlungs-API Erklären Sie, dass wir ihn basierend auf diesen Informationen mit C#-Code kapseln können. Für die Code-Kapselung ist der erste Punkt unser Schlüsselpunkt. Wenn die erste Schnittstelle erfolgreich gekapselt ist, sind die folgenden Schritte gemäß der allgemeinen Methode einfach. Es ist einfach, an diesen Schnittstellen weiterzuarbeiten.
Zum Beispiel können wir die API-Schnittstellendefinition der WeChat-Zahlung wie unten gezeigt definieren. Für die Eingabeparameter der Schnittstellenmethode definieren wir eine Entitätsklasse WxPayOrderData zum Speichern Einige Geschäftsparameter. Diese Parameter werden gemäß der Schnittstellenbeschreibung im zweiten Punkt definiert. Der Code lautet wie folgt:/// <summary> /// 微信支付接口 /// </summary> public interface ITenPayApi { /// <summary> /// 生成扫描支付模式一URL /// </summary> /// <param>商品ID /// <returns></returns> string GetPrePayUrl(string productId); /// <summary> /// 生成直接支付url,支付url有效期为2小时,模式二 /// </summary> /// <param>商品订单数据 /// <returns></returns> string GetPayUrl(WxPayOrderData info); /// <summary> /// 统一下单。(不需要证书,默认不需要) /// 除被扫支付场景以外,商户系统先调用该接口在微信支付服务后台生成预支付交易单, /// 返回正确的预支付交易回话标识后再按扫码、JSAPI、APP等不同场景生成交易串调起支付。 /// </summary> /// <param>商品订单数据 WxPayData UnifiedOrder(WxPayOrderData info); .............
Basierend auf der obigen Datendefinition können wir dann den Inhalt der einheitlichen Bestellfunktion realisieren, indem wir hauptsächlich die Eingabeparameter in die Wörterbuchparameter umwandeln, die wir sammeln müssen , wie im folgenden Code gezeigt.
/// <summary> /// 统一下单的商品订单信息 /// </summary> public class WxPayOrderData { /// <summary> /// 商品ID, trade_type=NATIVE,此参数必传 /// </summary> public string product_id { get; set; } /// <summary> /// 商品或支付单简要描述 /// </summary> public string body { get; set; } /// <summary> /// 订单总金额,单位为分 /// </summary> public int total_fee { get; set; } /// <summary> /// 商品标记,代金券或立减优惠功能的参数,说明详见代金券或立减优惠 /// </summary> public string goods_tag { get; set; } /// <summary> /// 交易类型,默认为:NATIVE。 /// JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付 /// </summary> public string trade_type { get; set; } /// <summary> /// 商品名称明细列表 /// </summary> public string detail { get; set; } /// <summary> /// 附加数据 /// 在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据 /// </summary> public string attach { get; set; } /// <summary> /// 用户标识 /// trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识。 /// </summary> public string openid { get; set; } public WxPayOrderData() { this.trade_type = "NATIVE"; } }
Für die endgültige Datenaustauschlogik können wir die XML-Daten an sie senden, indem wir die URL posten, um das Rückgabeergebnis zu erhalten, wie unten gezeigt.
public class WxPayData { //采用排序的Dictionary的好处是方便对数据包进行签名,不用再签名之前再做一次排序 private SortedDictionary<string> m_values = new SortedDictionary<string>(); /// <summary> /// 默认构造函数 /// 如果initDefault为true,则自动填入字段(appid,mch_id,time_stamp,nonce_str,out_trade_no,) /// </summary> public WxPayData(bool initDefault = false) { if(initDefault) { Init(); } } /// <summary> /// 对象初始化后,自动填入字段(appid,mch_id,time_stamp,nonce_str,out_trade_no,) /// </summary> public void Init() { //初始化几个参数 this.SetValue("appid", WxPayConfig.APPID);//公众帐号id this.SetValue("mch_id", WxPayConfig.MCHID);//商户号 this.SetValue("nonce_str", GenerateNonceStr());//随机字符串 this.SetValue("out_trade_no", GenerateOutTradeNo(WxPayConfig.MCHID));//随机字符串 }</string></string>
其中上面的函数的代码逻辑如下所示,主要是把返回的结果再还原为XML对象类WxPayData。
/// <summary> /// 通用的获取结果函数 /// </summary> private WxPayData GetPostResult(WxPayData data, string url) { string xml = data.ToXml(); string response = helper.GetHtml(url, xml, true); WxPayData result = new WxPayData(); result.FromXml(response); return result; }
对于扫码操作的模式二,直接生成一种二维码,不需要后台进行回调的,那么它的实现逻辑只需要对上面代码进行封装就可以了,如先构建二维码的函数代码如下所示。
/// <summary> /// 生成直接支付url,支付url有效期为2小时,模式二 /// </summary> /// <param>商品订单数据 /// <returns></returns> public string GetPayUrl(WxPayOrderData info) { WxPayData result = UnifiedOrder(info);//调用统一下单接口 return result.GetString("code_url");//获得统一下单接口返回的二维码链接 }
如在Winform界面里面,调用生成二维码的代码如下所示,主要逻辑就是构建好二维码,然后显示在界面上。
private void btnGetPayUrl_Click(object sender, EventArgs e) { //测试扫码模式二的生成二维码方式 WxPayOrderData data = new WxPayOrderData() { product_id = "123456789", body = "测试支付-模式二", attach = "爱奇迪技术支持", detail = "测试扫码支付-模式二", total_fee = 1, goods_tag = "test1" }; var url = api.GetPayUrl(data); var image = api.GenerateQRImage(url); this.imgGetPayUrl.Image = image; this.imgGetPayUrl.SizeMode = PictureBoxSizeMode.StretchImage; }
另外对于模式一,它在前端传入一个简单的产品ID,生成二维码,当用户扫码的时候,微信后台会调用商户平台(我们服务器)的回调处理方法,这个回调方法会调用统一下单的API进行生成支付交易,过程有点复杂,我们来看看,我们的实现代码如下所示。
/// <summary> /// 生成扫描支付模式一URL /// </summary> /// <param>商品ID /// <returns></returns> public string GetPrePayUrl(string productId) { WxPayData data = new WxPayData(true); data.SetValue("product_id", productId);//商品ID data.SetValue("time_stamp", data.GenerateTimeStamp());//随机字符串 data.SetValue("sign", data.MakeSign());//签名 string str = data.ToUrlParams();//转换为URL串 string url = "weixin://wxpay/bizpayurl?" + str; return url; }
它的调用代码生成二维码操作如下所示。
private void btnGetPrePayUrl_Click(object sender, EventArgs e) { var productId = "12345678"; var url = api.GetPrePayUrl(productId); var image = api.GenerateQRImage(url); this.imgGetPrePayUrl.Image = image; this.imgGetPayUrl.SizeMode = PictureBoxSizeMode.StretchImage; }
我们在第一小节里面介绍了,需要在微信后台配置扫码的回调函数,如下所示。
这样我们还需要添加一个页面aspx、或者一般处理程序ashx的方式来实现扫码的回调过程。具体的逻辑也就是在这个页面里面获取到提交过来的参数,然后调用统一下单处理后,进行数据返回即可,代码逻辑如下所示。
前面的例子,我介绍了Winfrom的扫码例子,很多时候,我们的应用可能是基于Web的,那么它的实现是如何的呢,下面我继续介绍一下。
首先我们在自己的业务Web后台系统里面,添加两个页面,主要是用来生成二维码在页面上进行展示的,如下所示。
最终我们在NativePayPage.aspx页面上展示我们的二维码,方便用户进行扫码支付处理,页面的代码很简单,我们只需要在前端页面放置两个图片控件,图片内容通过MakeQRCode.aspx页面进行生成就可以了。
nbsp;html> <meta> <meta> <title>微信支付样例-扫码支付</title> <div>扫码支付模式一</div><br> <image></image> <br><br><br> <div>扫码支付模式二</div><br> <image></image>
页面后台的代码就是绑定二维码的过程,代码如下所示,和Winform的代码类似操作。
protected void Page_Load(object sender, EventArgs e) { TenPayApi api = new TenPayApi(); var productId = "123456789"; //生成扫码支付模式一url string url1 = api.GetPrePayUrl(productId); //生成扫码支付模式二url WxPayOrderData info = new WxPayOrderData() { product_id = "123456789", body = "测试支付-模式二", attach = "爱奇迪技术支持", detail = "测试扫码支付-模式二", total_fee = 1, goods_tag = "test1" }; string url2 = api.GetPayUrl(info); //将url生成二维码图片 Image1.ImageUrl = "MakeQRCode.aspx?data=" + HttpUtility.UrlEncode(url1); Image2.ImageUrl = "MakeQRCode.aspx?data=" + HttpUtility.UrlEncode(url2); }
实现后的页面效果如下所示。
实现并预览效果,确定是我们所需的页面后,我们可以发布在公众号的菜单连接上进行测试使用了。
打开微信公众号-广州爱奇迪,我们可以看到对应的菜单发生改变,并且看到进入微信支付的菜单可以进行支付了。
Das Obige ist eine Implementierung des QR-Code-Scanprozesses der WeChat-Zahlung und umfasst auch viele andere API-Schnittstellen , wie folgt Es können weiterhin Möglichkeiten eingeführt werden. Obwohl die Schnittstellenimplementierung der WeChat-Zahlung komplizierter ist als bei anderen WeChat-Schnittstellen, wird der Rest nach Abschluss einiger Fälle relativ einfach sein, da die Aufrufmethode grundsätzlich konsistent und ähnlich ist.
Für weitere C#-Entwicklung des WeChat-Portals und die Anwendung des WeChat-Zahlungszugriffs und der API-Kapselung sowie verwandte Artikel beachten Sie bitte die chinesische PHP-Website!