この記事は[WeChat JSAPI Payment]の記事であり、主に加盟店がWeChat決済にどのように接続するかを説明し、簡易版をテストしています
1. JSAPI決済アクセス前の準備
1. JSAPI支払いにはまず公的アカウントの登録と認証が必要です(年間約300元)
2. 加盟店の申し込み 加盟店にはさまざまな種類(一般加盟店、サービスプロバイダー、特約店など)がございますので、ご自身のニーズに合わせてお申し込みください。
3. WeChatパブリックアカウントと販売者の関連付け
3.1. WeChat 公式アカウントにログインし、販売者アカウントをアプリケーション アカウントに関連付けます
3.2. 関連する加盟店番号
「追加」をクリックし、指示に従ってバインドを完了します。
4. appId と販売者番号を取得する
4.1.図に示すように、WeChat 公式アカウント にログインし、[Basic Configuration] ディレクトリに入り、公式アカウントの appId を取得します。
4.2.図に示すように、 WeChat Pay 販売者アカウント にログインし、[アカウント センター] -> [アカウント情報] -> [WeChat Pay 販売者 ID] を入力して、WeChat Pay 販売者アカウントを取得します。
5. WeChat マーチャント プラットフォーム にログインし、[アカウント センター > API セキュリティ] ディレクトリに入り、APIV3 キーを設定します。公式ドキュメントがある場合は、ここでは詳細を説明しません。
2. コードスニペット
1.Maven 依存関係を導入する
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-java</artifactId>
<version>0.2.7</version>
</dependency>
2. バックエンドビジネスリクエストインターフェース
独自のビジネス ニーズに応じて変更して使用します。パラメータは独自のニーズに基づいています。コードは次のとおりです (JSAPI の例)。
/** 商户号*/
@Value("${wx.mchId}")
private String mchId;
/** 公众号appid*/
@Value("${wx.appId}")
private String appId;
/** 商户APIV3密钥*/
@Value("${wx.apiV3Key}")
private String apiV3Key;
/**微信回调地址*/
@Value("${wx.v3PayNotifyUrl}")
private String v3PayNotifyUrl;
/** 商户证书序列号 */
@Value("${wx.merchantSerialNumber}")
private String merchantSerialNumber;
public static RSAAutoCertificateConfig config = null ;
public static JsapiServiceExtension service = null ;
@GetMapping("/prepay")
public PrepayWithRequestPaymentResponse WeChartPay(String amountString) {
String openId = "oI*******************iGiA";
// 订单号
String orderUuid = IdUtils.getUUID();
//元转换为分
Integer amountInteger = Integer.valueOf(AmountUnitConversionUtil.changeYuanAndFen(amountString));
//私钥文件路径(本地自己测试看自己的私钥文件存放路径)
String filePath ="***/***/***/apiclient_key.pem";//测试环境可放到resource目录下
// 一个商户号只能初始化一个配置,否则会因为重复的下载任务报错
if (config == null) {
config =new RSAAutoCertificateConfig.Builder()
.merchantId(mchId)
.privateKeyFromPath(filePath)
.merchantSerialNumber(merchantSerialNumber)
.apiV3Key(apiV3Key)
.build();
}
// 构建service
if (service == null) {
service = new JsapiServiceExtension.Builder().config(config).build();
}
//组装预约支付的实体
// request.setXxx(val)设置所需参数,具体参数可见Request定义
PrepayRequest request = new PrepayRequest();
//计算金额
Amount amount = new Amount();
amount.setTotal(amountInteger);
amount.setCurrency("CNY");
request.setAmount(amount);
//公众号appId
request.setAppid(appId);
//商户号
request.setMchid(mchId);
//支付者信息
Payer payer = new Payer();
payer.setOpenid(openId);
request.setPayer(payer);
//描述
request.setDescription("支付测试");
//微信回调地址,需要是https://开头的,必须外网可以正常访问
//本地测试可以使用内网穿透工具,网上很多的
request.setNotifyUrl(v3PayNotifyUrl);
//订单号
request.setOutTradeNo(orderUuid);
// 加密
PrepayWithRequestPaymentResponse payment = service.prepayWithRequestPayment(request);
//默认加密类型为RSA
payment.setSignType("MD5");
//返回数据,前端调起支付
return payment;
3. フロントエンドが支払いリクエストメソッドを呼び出します。
function onBridgeReady(){
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId":"wx2421b1c4370ec43b", //公众号ID,由商户传入
"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();
}
要約する
上記は、公式ドキュメントに従って実装された WeChat JSAPI 支払いテストです。WeChat コールバック インターフェイスの詳細については説明しません。必要な場合はメッセージを残してください。ご質問がある場合は、議論するためにメッセージを残すことができます。一緒に学びましょう!