Network Security Internet Technology Development Database Servers Mobile Phone Android Software Apple Software Computer Software News IT Information

In addition to Weibo, there is also WeChat

Please pay attention

WeChat public account

Shulou

WeChat Pay access steps

2025-02-24 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Internet Technology >

Share

Shulou(Shulou.com)06/02 Report--

This article mainly explains "WeChat Pay access steps". Friends who are interested may wish to have a look. The method introduced in this paper is simple, fast and practical. Now let the editor take you to learn the "WeChat Pay access steps"!

Access steps

The steps for WeChat Pay to connect are as follows:

Get the payment API URL

Build request parameters

Initiate a request

Evoke payment

Payment asynchronous notification processing

To obtain the payment interface URL in step 1, you need to consider these points

How to support both domestic WeChat Pay and overseas WeChat Pay

How to support both the ordinary merchant model and the service provider model

The problem often encountered in step 2 is parameter signature verification.

MD5 encryption

HMAC-SHA256 encryption

The difficulty in step 3 lies in the handling of WeChat Pay's two-way certificate.

In step 4, the second signature of the prepaid order is abnormal and evokes payment prompts for various configuration errors

Asynchronous notification verification signature, order repeat notification and decryption of sensitive data in step 5

Which holes have you stepped on in the above access steps? Welcome to share and exchange in the comment area.

Talk is cheap. Show me the code

Get the interface URL of WeChat Pay

Some people will say, "isn't it easy?" it's available in the official documentation interface. You are right, so how to achieve a system to support both domestic WeChat Pay and overseas WeChat Pay, and how to do cross-city redundancy plan?

Wechat domain name

Wechat provides different domain names to support it according to different business areas.

Api.mch.weixin.qq.com (recommended access point: within China)

Api2.mch.weixin.qq.com (recommended access point: domestic backup in China)

Apihk.mch.weixin.qq.com (recommended access point: southeast Asia)

Apius.mch.weixin.qq.com (recommended access point: other)

Api.mch.weixin.qq.com/sandboxnew (Special: simulation Test)

If you are smart, it is not difficult for you to think of enumeration. for specific cross-city redundancy plans, you can refer to WeChat Pay merchant system cross-city redundancy upgrade guidelines.

/ *

IJPay makes payments within reach, encapsulating the common payment methods and interfaces commonly used by WeChat Pay, Alipay and UnionPay.

* *

Do not rely on any third-party mvc framework, just as a tool to simply and quickly complete the development of the payment module, can be easily embedded in any system.

* *

IJPay communication group: 723992875

* *

Node.js version: https://gitee.com/javen205/TNW

* *

Enumerate WeChat Pay's available domain names

* * @ author Javen * / public enum WxDomain {/ * China * / CHINA ("https://api.mch.weixin.qq.com"), / * China domestic (alternate domain name) * / CHINA2 (" https://api2.mch.weixin.qq.com"), ") / * * Southeast Asia * / HK ("https://apihk.mch.weixin.qq.com"), / * * other * / US (" https://apius.mch.weixin.qq.com"); " / * * Domain name * / private final String domain; WxDomain (String domain) {this.domain = domain;} public String getType () {return domain;}}

At this point, the core problem of obtaining the WeChat Pay interface URL has been solved. The rest is to splice the specific payment interface URL according to different payment methods.

Common interfaces of WeChat Pay

Payment code payment, JSAPI payment, Native payment, App payment, H5 payment, Mini Program payment, red packet, corporate payment, hotel deposit, facial scan payment commonly used payment methods and payment tools incomplete statistics interface probably has 90 +

Package com.ijpay.wxpay.enums;/** *

IJPay makes payments within reach, encapsulating the common payment methods and interfaces commonly used by WeChat Pay, Alipay and UnionPay.

* *

Do not rely on any third-party mvc framework, just as a tool to simply and quickly complete the development of the payment module, can be easily embedded in any system.

* *

IJPay communication group: 723992875

* *

Node.js version: https://gitee.com/javen205/TNW

* *

WeChat Pay interface enumeration

* * @ author Javen * / public enum WxApiType {/ * sandboxed environment * / SAND_BOX_NEW ("/ sandboxnew"), / * obtain the sandboxed environment key * / GET_SIGN_KEY ("/ sandboxnew/pay/getsignkey"), / * issue a unified order * / UNIFIED_ORDER ("/ pay/unifiedorder") / * submit payment code payment * / MICRO_PAY ("/ pay/micropay"), / * query order * / ORDER_QUERY ("/ pay/orderquery"), / * close order * / CLOSE_ORDER ("/ pay/closeorder") / * * cancel order * / REVERSE ("/ secapi/pay/reverse"), / * apply for refund * / REFUND ("/ secapi/pay/refund"), / * * query refund * / REFUND_QUERY ("/ pay/refundquery") / * download statement * / DOWNLOAD_BILL ("/ pay/downloadbill"), / * * download statement of funds * / DOWNLOAD_FUND_FLOW ("/ pay/downloadfundflow"), / * transaction guarantee * / REPORT ("/ payitil/report") / * convert short link * / SHORT_URL ("/ tools/shorturl"), / * query openId * / AUTH_CODE_TO_OPENID ("/ tools/authcodetoopenid") with authorization code, / * pull order evaluation data * / BATCH_QUERY_COMMENT ("/ billcommentsp/batchquerycomment") / * Enterprise payment * / TRANSFER ("/ mmpaymkttransfers/promotion/transfers"), / * * query Enterprise payment * / GET_TRANSFER_INFO ("/ mmpaymkttransfers/gettransferinfo"), / * Enterprise payment to Bank Card * / TRANSFER_BANK ("/ mmpaysptrans/pay_bank") / * query enterprises to pay to bank card * / GET_TRANSFER_BANK_INFO ("/ mmpaysptrans/query_bank"), / * obtain RSA encryption public key * / GET_PUBLIC_KEY ("/ risk/getpublickey"), / * * issue red packets * / SEND_RED_PACK ("/ mmpaymkttransfers/sendredpack") / * send fission red packets * / SEND_GROUP_RED_PACK ("/ mmpaymkttransfers/sendgroupredpack"), / * query red packet records * / GET_HB_INFO ("/ mmpaymkttransfers/gethbinfo"), / * Mini Program send red packets * / SEND_MINI_PROGRAM_HB ("/ mmpaymkttransfers/sendminiprogramhb") / * issue vouchers * / SEND_COUPON ("/ mmpaymkttransfers/send_coupon"), / * query voucher batches * / QUERY_COUPON_STOCK ("/ mmpaymkttransfers/query_coupon_stock"), / * query voucher information * / QUERY_COUPONS_INFO ("/ mmpaymkttransfers/querycouponsinfo") / * request single split * / PROFIT_SHARING ("/ secapi/pay/profitsharing"), / * request multiple split * / MULTI_PROFIT_SHARING ("/ secapi/pay/multiprofitsharing"), / * query split result * / PROFIT_SHARING_QUERY ("/ pay/profitsharingquery") / * add split recipient * / PROFITS_HARING_ADD_RECEIVER ("/ pay/profitsharingaddreceiver"), / * delete split recipient * / PROFIT_SHARING_REMOVE_RECEIVER ("/ pay/profitsharingremovereceiver"), / * close split * / PROFIT_SHARING_FINISH ("/ secapi/pay/profitsharingfinish") / * split account return * / PROFIT_SHARING_RETURN ("/ secapi/pay/profitsharingreturn"), / * query the result of split account return * / PROFIT_SHARING_RETURN_QUERY ("/ pay/profitsharingreturnquery"), / * pay deposit (face payment) * / DEPOSIT_FACE_PAY ("/ deposit/facepay") / * pay deposit (payment code) * / DEPOSIT_MICRO_PAY ("/ deposit/micropay"), / * query order (deposit) * / DEPOSIT_ORDER_QUERY ("/ deposit/orderquery"), / * * cancel order (deposit) * / DEPOSIT_REVERSE ("/ deposit/reverse") / * * Consumer deposit * / DEPOSIT_CONSUME ("/ deposit/consume"), / * apply for refund (deposit) * / DEPOSIT_REFUND ("/ deposit/refund"), / * inquire for refund (deposit) * / DEPOSIT_REFUND_QUERY ("deposit/refundquery") / * official account pure contract * / ENTRUST_WEB ("/ papay/entrustweb"), / * official account pure contract (service provider mode) * / PARTNER_ENTRUST_WEB ("/ papay/partner/entrustweb"), / * APP pure contract * / PRE_ENTRUST_WEB ("/ papay/preentrustweb") / * APP pure contract (service provider model) * / PARTNER_PRE_ENTRUST_WEB ("/ papay/partner/preentrustweb"), / * H5 pure contract * / H5_ENTRUST_WEB ("/ papay/h6entrustweb"), / * * H5 pure contract (service provider mode) * / PARTNER_H5_ENTRUST_WEB ("/ papay/partner/h6entrustweb") / * sign contract in payment * / PAY_CONTRACT_ORDER ("/ pay/contractorder"), / * query contract relationship * / QUERY_ENTRUST_CONTRACT ("/ papay/querycontract"), / * query contract relationship (service provider mode) * / PARTNER_QUERY_ENTRUST_CONTRACT ("/ papay/partner/querycontract") / * withholding request * / PAP_PAY_APPLY ("/ pay/pappayapply"), / * withholding request (service provider mode) * / PARTNER_PAP_PAY_APPLY ("/ pay/partner/pappayapply"), / * * query withholding order * / PAP_ORDER_QUERY ("/ pay/paporderquery") / * query withholding order * / PARTNER_PAP_ORDER_QUERY ("/ pay/partner/paporderquery"), / * * apply for cancellation of contract * / DELETE_ENTRUST_CONTRACT ("/ papay/deletecontract"), / * apply for termination of contract (service provider model) * / PARTNER_DELETE_ENTRUST_CONTRACT ("/ papay/partner/deletecontract") / * facial scan payment * / FACE_PAY ("/ pay/facepay"), / * query facial scan payment order * / FACE_PAY_QUERY ("/ pay/facepayqueryy"), / * cancel facial scan payment order * / FACE_PAY_REVERSE ("/ secapi/pay/facepayreverse") / * small and micro merchants apply for residence * / MICRO_SUBMIT ("/ applyment/micro/submit"), / * query application status * / GET_MICRO_SUBMIT_STATE ("/ applyment/micro/getstate"), / * submit upgrade application * / MICRO_SUBMIT_UPGRADE ("/ applyment/micro/submitupgrade") / * query upgrade application form status * / GET_MICRO_UPGRADE_STATE ("/ applyment/micro/getupgradestate"), / * query withdrawal status * / QUERY_AUTO_WITH_DRAW_BY_DATE ("/ fund/queryautowithdrawbydate"), / * modify settlement bank card * / MICRO_MODIFY_ARCHIVES ("/ applyment/micro/modifyarchives") / * re-launch withdrawal * / RE_AUTO_WITH_DRAW_BY_DATE ("/ fund/reautowithdrawbydate"), / * modify contact information * / MICRO_MODIFY_CONTACT_INFO ("/ applyment/micro/modifycontactinfo"), / * small and micro merchants pay attention to feature configuration * / ADD_RECOMMEND_CONF ("/ secapi/mkt/addrecommendconf") / * * small and micro merchants develop configuration add payment directory * / ADD_SUB_DEV_CONFIG ("/ secapi/mch/addsubdevconfig"), / * small and micro merchants develop configuration query * / QUERY_SUB_DEV_CONFIG ("/ secapi/mch/querysubdevconfig") / * Type * / private final String type; WxApiType (String type) {this.type = type;} public String getType () {return type;}} get the complete URL scheme

At the same time, it supports the switching of any interface and any domain name, which lays a good foundation for cross-city redundancy.

/ * get the URL of the API request * * @ param wxApiType {@ link WxApiType} pay API API enumeration * @ return {@ link String} return the complete API request URL * / public static String getReqUrl (WxApiType wxApiType) {return getReqUrl (wxApiType, null, false) } / * get the URL of the API request * * @ param wxApiType {@ link WxApiType} pay API API enumeration * @ param isSandBox is a sandbox environment * @ return {@ link String} return the complete interface request URL * / public static String getReqUrl (WxApiType wxApiType, boolean isSandBox) {return getReqUrl (wxApiType, null, isSandBox) } / * get URL * * @ param wxApiType {@ link WxApiType} payment API API enumeration * @ param wxDomain {@ link WxDomain} payment API Interface Domain name enumeration * @ param isSandBox is a sandbox environment * @ return {@ link String} return the complete API request URL * / public static String getReqUrl (WxApiType wxApiType, WxDomain wxDomain) Boolean isSandBox) {if (wxDomain = = null) {wxDomain = WxDomain.CHINA } return wxDomain.getType () .concat (isSandBox? WxApiType.SAND_BOX_NEW.getType (): ") .concat (wxApiType.getType ());} build request parameters Model build implementation mechanism

Here, the request parameters are built using the Lombok + Java reflection mechanism.

Encapsulate Model to automatically generate signatures

The BaseModel implementation converts the properties and values in the object after Lombok builder to Map and provides a way to create a signature to automatically generate sign (both MD5 and HMAC-SHA256 are supported). Take the unified order in WeChat Pay as an example, the code is as follows

Public class BaseModel {/ * converts the constructed builder to Map * * @ return transformed Map * / public Map toMap () {String [] fieldNames = getFiledNames (this); HashMap map = new HashMap (fieldNames.length); for (int I = 0; I < fieldNames.length; iTunes +) {String name = fieldNames [I] String value = (String) getFieldValueByName (name, this); if (StrUtil.isNotEmpty (value)) {map.put (name, value);}} return map } / * build signature Map * * @ param partnerKey API KEY * @ param signType {@ link SignType} signature type * @ return Map * / public Map createSign (String partnerKey, SignType signType) {return createSign (partnerKey,signType,true) after signature construction } / * build signature Map * * @ param partnerKey API KEY * @ param signType {@ link SignType} signature type * @ param haveSignType signature contains sign_type field * @ return Map * / public Map createSign (String partnerKey, SignType signType, boolean haveSignType) {return WxPayKit.buildSign (toMap (), partnerKey, signType,haveSignType) } / * get an array of attribute names * * @ param obj object * @ return returns an array of object attribute names * / public String [] getFiledNames (Object obj) {Field [] fields = obj.getClass (). GetDeclaredFields (); String [] fieldNames = new String [fields.length]; for (int I = 0; I < fields.length) ) {fieldNames [I] = fields.getName ();} return fieldNames } / * get the attribute value according to the attribute name * * @ param fieldName attribute name * @ param obj object * @ return returns the value of the corresponding attribute * / public Object getFieldValueByName (String fieldName, Object obj) {try {String firstLetter = fieldName.substring (0,1). ToUpperCase () String getter = new StringBuffer () .append ("get") .append (firstLetter) .append (fieldName.substring (1)) .toString (); Method method = obj.getClass () .getMethod (getter, new Class [] {}); return method.invoke (obj, new Object [] {}) } catch (Exception e) {return null;}

UnifiedOrderModel Wechat issued an order uniformly

/ *

IJPay makes payments within reach, encapsulating the common payment methods and interfaces commonly used by WeChat Pay, Alipay and UnionPay.

* *

Do not rely on any third-party mvc framework, just as a tool to simply and quickly complete the development of the payment module, can be easily embedded in any system.

* *

IJPay communication group: 723992875

* *

Node.js version: https://gitee.com/javen205/TNW

* *

Unified order Model

* * @ author Javen * / package com.ijpay.wxpay.model;import com.ijpay.core.model.BaseModel;import lombok.AccessLevel;import lombok.AllArgsConstructor;import lombok.Builder;import lombok.Getter;@Builder@AllArgsConstructor (access = AccessLevel.PRIVATE) @ Getterpublic class UnifiedOrderModel extends BaseModel {private String appid; private String mch_id; private String sub_appid; private String sub_mch_id; private String device_info; private String nonce_str; private String sign; private String sign_type Private String body; private String detail; private String attach; private String out_trade_no; private String fee_type; private String total_fee; private String spbill_create_ip; private String time_start; private String time_expire; private String goods_tag; private String notify_url; private String trade_type; private String product_id; private String limit_pay; private String openid; private String sub_openid; private String receipt Private String scene_info;}

The familiar fields in UnifiedOrderModel come entirely from the official interface documentation. Unfortunately, Model does not follow the naming rules of the hump.

Implementation of signature algorithm

MD5 and HMAC-SHA256 signature algorithms are implemented using utility classes provided by Hutool.

Public static String hmacSha256 (String data, String key) {return SecureUtil.hmac (HmacAlgorithm.HmacSHA256, key) .digestHex (data, CharsetUtil.UTF_8);} public static String md5 (String data) {return SecureUtil.md5 (data);}

The logic of building a signature is as follows

/ * build signature * * @ param params parameters required for signature * @ param partnerKey key * @ param signType signature type * @ Map * / public static Map buildSign (Map params, String partnerKey, SignType signType) {return buildSign (params,partnerKey,signType,true) after signature by return } / * Building signature * * @ parameters required for signature by param params * @ param partnerKey key * @ param signType signature Type * @ param haveSignType signature contains the sign_type field * @ return signed Map * / public static Map buildSign (Map params, String partnerKey, SignType signType) Boolean haveSignType) {if (haveSignType) {params.put (FIELD_SIGN_TYPE, signType.getType ()) } String sign = createSign (params, partnerKey, signType); params.put (FIELD_SIGN, sign); return params } / * * generate signature * * @ param params parameters required to sign * @ param partnerKey key * @ param signType signature type * @ return signed data * / public static String createSign (Map params, String partnerKey, SignType signType) {if (signType = = null) {signType = SignType.MD5 } / / remove sign params.remove (FIELD_SIGN) before generating signature; String tempStr = PayKit.createLinkString (params); String stringSignTemp = tempStr + "& key=" + partnerKey; if (signType = = SignType.MD5) {return md5 (stringSignTemp). ToUpperCase ();} else {return hmacSha256 (stringSignTemp, partnerKey). ToUpperCase () }} build xml data through Model

After the encapsulation above, less than 20 lines of code can be used to build the xml data needed for WeChat Pay interface through Model.

WxPayApiConfig wxPayApiConfig = WxPayApiConfigKit.getWxPayApiConfig () Map params = UnifiedOrderModel .builder () .appId (wxPayApiConfig.getAppId ()) .mch _ id (wxPayApiConfig.getMchId ()) .nonce _ str (WxPayKit.generateStr ()) .body ("IJPay makes payment accessible-official account payment") .payment ("Node.js version: Https://gitee.com/javen205/TNW") .out _ trade_no (WxPayKit.generateStr ()) .total _ fee ("1000") .spbill _ create_ip (ip) .trade _ type (TradeType.JSAPI.getTradeType ()) .openid (openId) .build () .createSign (wxPayApiConfig.getPartnerKey () SignType.HMACSHA256) String xml = WxPayKit.toXml (params); log.info (xml); initiate a request

Please refer to the extended Http request for details because of the space.

Evoke payment

The common problems here are the second signature exception of the prepaid order and various configuration errors that evoke payment prompts, such as the authorization directory is not configured.

Prepaid order secondary signature package

/ *

Official account payment-prepaid order signed again

*

Note that the signature method here must be consistent with the signature type of the unified order.

* * @ param prepayId prepaid order No. * @ param appId Application No. * @ param partnerKey API Key * @ param signType signature method * @ return Map * / public static Map prepayIdCreateSign (String prepayId, String appId, String partnerKey, SignType signType) {Map packageParams = new HashMap (6); packageParams.put ("appId", appId) PackageParams.put ("timeStamp", String.valueOf (System.currentTimeMillis () / 1000)); packageParams.put ("nonceStr", String.valueOf (System.currentTimeMillis (); packageParams.put ("package", "prepay_id=" + prepayId); if (signType = = null) {signType = SignType.MD5;} packageParams.put ("signType", signType.getType ()) String packageSign = WxPayKit.createSign (packageParams, partnerKey, signType); packageParams.put ("paySign", packageSign); return packageParams;} / * *

APP payment-prepaid order sign again

*

Note that the signature method here must be consistent with the signature type of the unified order.

* * @ param appId application number * @ param partnerId merchant number * @ param prepayId prepaid order number * @ param partnerKey API Key * @ param signType signature method * @ return Map * / public static Map appPrepayIdCreateSign (String appId, String partnerId, String prepayId, String partnerKey, SignType signType) {Map packageParams = new HashMap (8) PackageParams.put ("appid", appId); packageParams.put ("partnerid", partnerId); packageParams.put ("prepayid", prepayId); packageParams.put ("package", "Sign=WXPay"); packageParams.put ("noncestr", String.valueOf (System.currentTimeMillis ()); packageParams.put ("timestamp", String.valueOf (System.currentTimeMillis () / 1000)) If (signType = = null) {signType = SignType.MD5;} String packageSign = createSign (packageParams, partnerKey, signType); packageParams.put ("sign", packageSign); return packageParams;} / *

Mini Program-prepaid order sign again

*

Note that the signature method here must be consistent with the signature type of the unified order.

* * @ param appId Application No. * @ param prepayId prepaid order No. * @ param partnerKey API Key * @ param signType signature method * @ return Map * / public static Map miniAppPrepayIdCreateSign (String appId, String prepayId, String partnerKey, SignType signType) {Map packageParams = new HashMap (6); packageParams.put ("appId", appId) PackageParams.put ("timeStamp", String.valueOf (System.currentTimeMillis () / 1000)); packageParams.put ("nonceStr", String.valueOf (System.currentTimeMillis (); packageParams.put ("package", "prepay_id=" + prepayId); if (signType = = null) {signType = SignType.MD5;} packageParams.put ("signType", signType.getType ()) String packageSign = createSign (packageParams, partnerKey, signType); packageParams.put ("paySign", packageSign); return packageParams;}

Please refer to IJPay-Demo-SpringBoot for specific use cases

Payment Asynchronous Notification

At present, there are two kinds of WeChat Pay asynchronous notifications: payment result asynchronous notification and Wechat refund asynchronous notification.

Notes: 1. Respond to the corresponding reply in a timely manner. 2. Asynchronous notification needs to be reprocessed according to the order number. 3. The signature method of asynchronous notification of payment result must be consistent with the signature method of issuing order uniformly. 4. Java.security.InvalidKeyException: Illegal key size exception solution appears in Wechat refund asynchronous notification.

Verify sign * * @ param params parameter * @ param partnerKey payment key * @ param signType {@ link SignType} * @ return * / public static boolean verifyNotify (Map params, String partnerKey, SignType signType) {String sign = params.get ("sign") when verifying signature encapsulation / * payment asynchronous notification; String localSign = createSign (params, partnerKey, signType) Return sign.equals (localSign);}

WeChat Pay asynchronously notifies the pseudo code of the business processing logic of the result

/ * * Asynchronous Notification * / @ RequestMapping (value = "/ payNotify", method = {RequestMethod.POST, RequestMethod.GET}) @ ResponseBody public String payNotify (HttpServletRequest request) {String xmlMsg = HttpKit.readData (request); log.info ("payment notice =" + xmlMsg); Map params = WxPayKit.xmlToMap (xmlMsg); String returnCode = params.get ("return_code") / / pay attention to the situation of repeated notifications. The same order number may receive multiple notifications. Please note that you must first judge the order status / / Note that the signature method here must be consistent with the signature type of the unified order if (WxPayKit.verifyNotify (params, WxPayApiConfigKit.getWxPayApiConfig (). GetPartnerKey ()) SignType.HMACSHA256) {if (WxPayKit.codeIsOk (returnCode)) {/ / update order information / / send notification, etc. Map xml = new HashMap (2) Xml.put ("return_code", "SUCCESS"); xml.put ("return_msg", "OK"); return WxPayKit.toXml (xml);}} return null;} Wechat refund data decryption

For the detailed steps of decrypting Wechat refund data, please refer to the official documentation. Here is the SecureUtil implementation provided by Hutool.

/ * * AES decryption * * @ param base64Data data to be decrypted * @ param key key * @ return decrypted data * / public static String decryptData (String base64Data, String key) {return SecureUtil.aes (md5 (key). ToLowerCase (). GetBytes ()) .decryptStr (base64Data);}

Pseudo code of Wechat refund notification business processing logic

/ * * refund notice * / @ RequestMapping (value = "/ refundNotify", method = {RequestMethod.POST, RequestMethod.GET}) @ ResponseBody public String refundNotify (HttpServletRequest request) {String xmlMsg = HttpKit.readData (request); log.info ("refund notice =" + xmlMsg); Map params = WxPayKit.xmlToMap (xmlMsg); String returnCode = params.get ("return_code") / / pay attention to the situation of repeated notifications. The same order number may receive multiple notifications. Please be sure to judge the order status if (WxPayKit.codeIsOk (returnCode)) {String reqInfo = params.get ("req_info"); String decryptData = WxPayKit.decryptData (reqInfo, WxPayApiConfigKit.getWxPayApiConfig (). GetPartnerKey ()); log.info ("data after refund notification decryption =" + decryptData) / / Update order information / / send notifications, etc. Map xml = new HashMap (2); xml.put ("return_code", "SUCCESS"); xml.put ("return_msg", "OK"); return WxPayKit.toXml (xml);} return null } at this point, I believe you have a deeper understanding of the "WeChat Pay access steps". You might as well do it in practice. Here is the website, more related content can enter the relevant channels to inquire, follow us, continue to learn!

Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.

Views: 0

*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.

Share To

Internet Technology

Wechat

© 2024 shulou.com SLNews company. All rights reserved.

12
Report