貼個官網(wǎng),建議down下來他的源碼,對照著開發(fā)更方便,因為備注很詳盡。
其它不多廢話了,我直接寫步驟了。
1. Maven引入
時間2023年5月,目前最新版本是4.5.0
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>4.5.0</version>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
<version>4.5.0</version>
</dependency>
2. 微信小程序參數(shù)配置
考慮到多微信小程序和微信支付多商戶的問題,我們的配置將會是以集合的形式存在
2.1 propertie格式
wx.mini.configs[0].appid:wx0123948575
wx.mini.configs[0].secret:4023c4f58d704d9
wx.mini.configs[1].appid:wx01239485jo
wx.mini.configs[1].secret:4023c4f58d
每組的配置項以類似下標的形式區(qū)分開
2.2 yaml格式
wx:
mini:
login:
configs:
- appid: wx02792790
secret: 4023c4f58d704d9
pay:
configs:
- mchId: xxxxx
" - " 后面表示一組數(shù)據(jù), 登錄和支付的必傳參數(shù),自己補全吧
yaml的格式應該是有問題的,各位自己注意下就好
3. 類
3.1 Properties對應的對象
@Data
@ConfigurationProperties(prefix = "wx.mini.login")
public class WxMpLoginProperties {
private List<Config> configs;
@Data
public static class Config {
/**
* 設置微信小程序的appid
*/
private String appid;
/**
* 設置微信小程序的Secret
*/
private String secret;
/**
* 設置微信小程序消息服務器配置的token
*/
private String token;
/**
* 設置微信小程序消息服務器配置的EncodingAESKey
*/
private String aesKey;
/**
* 消息格式,XML或者JSON
*/
private String msgDataFormat;
}
}
@Data
@ConfigurationProperties(prefix = "wx.mini.pay")
public class WxMpPayProperties {
private List<Config> configs;
@Data
public static class Config {
private String mchId;
private String wxApiV3Key;
private String notify_url;
/**
* 證書-序列號
* 1D685BC1A16B008C7714E3A255C9408607D1738C
*/
private String mchSerialNo;
/**
* https://api.mch.weixin.qq.com/v3/certificates
*/
private String v3CertUrl;
/**
* 證書所在服務器位置 如 /payment/yfyxs/apiclient_key.pem
*/
private String keyPath;
/**
* apiclient_key.pem證書文件的內容
*/
private String apiClientKey;
/**
* apiclient_cert.pem證書文件的內容
*/
private String apiClientCert;
/**
* 商戶簽名使用 商戶私鑰 ,證書序列號包含在請求HTTP頭部的 Authorization的serial_no
* 微信支付簽名使用微信支付平臺私鑰,證書序列號包含在應答HTTP頭部的Wechatpay-Serial
* 商戶上送敏感信息時使用微信支付平臺公鑰加密,證書序列號包含在請求HTTP頭部的 Wechatpay-Serial
*/
}
}
這2個類編寫完之后
@ConfigurationProperties
會報錯,但是先不要管它。
3.2 WxMpConfig
@Slf4j
@Configuration
@EnableConfigurationProperties({WxMpLoginProperties.class,WxMpPayProperties.class})
public class WxMpConfig {
private final WxMpLoginProperties loginProperties;
private final WxMpPayProperties payProperties;
public WxMpConfig(WxMpLoginProperties loginProperties, WxMpPayProperties payProperties) {
this.loginProperties = loginProperties;
this.payProperties = payProperties;
}
/**
* 與微信小程序有關的總service
* @return WxMaService
*/
@Bean
public WxMaService wxMaService() {
List<WxMpLoginProperties.Config> configs = this.loginProperties.getConfigs();
if (configs == null) {
throw new ApiException("沒有微信小程序配置啊");
}
WxMaServiceImpl maService = new WxMaServiceImpl();
Map<String, WxMaDefaultConfigImpl> multiConfigs = configs.stream()
.map(cof -> {
WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
config.setAppid(cof.getAppid());
config.setSecret(cof.getSecret());
config.setToken(cof.getToken());
config.setAesKey(cof.getAesKey());
config.setMsgDataFormat(cof.getMsgDataFormat());
return config;
})
.collect(Collectors.toMap(WxMaDefaultConfigImpl::getAppid, Function.identity(), (o, n) -> o));
maService.setMultiConfigs(multiConfigs);
return maService;
}
@Bean
public WxPayService wxPayService() {
List<WxMpPayProperties.Config> configs = this.payProperties.getConfigs();
if (configs == null) {
throw new ApiException("沒有微信小程序配置啊");
}
WxPayService wxPayService = new WxPayServiceImpl();
this.payProperties.getConfigs().stream().forEach(merchant -> {
WxPayConfig payConfig = new WxPayConfig();
payConfig.setMchId(merchant.getMchId());
payConfig.setCertSerialNo(merchant.getMchSerialNo());
payConfig.setApiV3Key(merchant.getWxApiV3Key());
payConfig.setPrivateKeyContent(merchant.getApiClientKey().getBytes());
payConfig.setPrivateCertContent(merchant.getApiClientCert().getBytes());
wxPayService.addConfig(merchant.getMchId(), payConfig);
// 可以指定是否使用沙箱環(huán)境
payConfig.setUseSandboxEnv(false);
});
return wxPayService;
}
}
到目前為止我們的準備工作就做完了。剩下的就是業(yè)務邏輯代碼的開發(fā)了。
4. 業(yè)務代碼編寫
4.1 登錄的code2session demo
具體的完整的微信登錄流程不會寫在這里,我們只是看下如果使用binary-wang
給我們封裝的接口(再強調下,只是demo所以整體無關規(guī)范問題,在此service層不面向接口編程)
@Service
@Slf4j
public class WeiXinLoginDemoService {
@Autowired
private WxMaService wxMaService;
public void weixinCode2SessionDemo(String appId) {
if (!wxMaService.switchover(appId)) {
throw new ApiException(String.format("未找到對應appid=[%s]的配置,請核 實!", appId));
}
//code 2 session
WxMaJscode2SessionResult jscode2SessionResult = wxMaService.getUserService().getSessionInfo(wcp.getCode());
log.info("result:{}", jscode2SessionResult.toString());
}
}
4.2 微信支付demo
具體的微信支付邏輯這里也不會寫,只是告訴你用binary-wang
做微信支付的話我們需要準備什么東西。文章來源:http://www.zghlxwxcb.cn/news/detail-444226.html
@Service
@Slf4j
public class WeiXinPayDemoService {
@Autowired
private WxPayService wxPayService;
/**
* 統(tǒng)一下單demo
**/
public void weixinUnifiedOrderV3Demo(String mchId) {
if (!wxPayService.switchover(mchId)) {
throw new ApiException(String.format("未找到對應mchid=[%s]的配置,請核 實!", mchId));
}
//調用統(tǒng)一下單接口,WxPayUnifiedOrderV3Request具體需要的邏輯參數(shù)需要參考官方文檔,但是我們閱讀unifiedOrderV3這個接口的源碼
//就能知道appId mchId 以及url都不需要我們傳入,我們只要傳具體的業(yè)務參數(shù)即可比如貴司生成的orderId
WxPayUnifiedOrderV3Result wxPayUnifiedOrderV3Result = wxPayService.unifiedOrderV3(TradeTypeEnum.H5, new WxPayUnifiedOrderV3Request());
log.info("result:{}", wxPayUnifiedOrderV3Result.toString());
}
}
以上差不多了。有錯誤的話,感謝指出。有問題的話,共同討論。文章來源地址http://www.zghlxwxcb.cn/news/detail-444226.html
到了這里,關于使用binary-wang開發(fā)微信小程序的登錄和微信支付的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!