这次做微信h5支付(Mweb)时发现很多时间都花费在需申请和配置的操作上,所以整体记录下这次h5支付(Mweb)的流程作为备忘录。
1.申请h5支付的权限
申请入口:登录微信商户平台-->产品中心-->我的产品-->支付产品-->H5支付点击申请开通(这里面会让你上传一些应用截图、以及域名(备案好的)等信息,需要提前准备好)。申请完后等待审核通过即可
2.配置微信h5支付域名
方式:登录微信商户平台-->产品中心-->开发配置-->h5支付域名
(如果不配置,则会报商家存在未配置的参数,请联系商家解决的错误)
3.进行后台接口开发
支付接口主要就是微信开发文档上的统一下单接口https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1
接口需要的参数和参数说明请参考上面的链接。我采用的是第三方封装好的方式去支付的,下来我贴出h5支付的代码:
1.pom文件引入
<!-- 微信支付-->
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
2.采用这个第三方我们必须设置一个配置类,并且这个配置类必须实现WXPayConfig接口,参考以下代码:
import java.io.InputStream;
import org.springframework.stereotype.Component;
import com.github.wxpay.sdk.WXPayConfig;
@Component
public class WeChatConfig implements WXPayConfig{
public static String APPID = "xxx"; //appID
public static String APPKEY = "xxx"; //商户秘钥
public static String MCHID = "xxx";//商户号
public static String NOTIFY_URL = "xxx";//异步通知链接
public static final String WECHATURL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
@Override
public String getAppID() {
return APPID;
}
@Override
public String getMchID() {
return MCHID;
}
@Override
public String getKey() {
return APPKEY;
}
@Override
public InputStream getCertStream() {
return null;
}
@Override
public int getHttpConnectTimeoutMs() {
return 0;
}
@Override
public int getHttpReadTimeoutMs() {
return 0;
}
}
这里面需要注意的是APPID、APPKEY(商户秘钥)、MCHID(商户号)从哪里去寻找!
查看APPID:
方式1:登录微信商户平台-->营销中心-->支付后配置 中可以看到
方式2:可在微信公众平台中看到
查看APPKEY(商户秘钥)
方式1:登录微信商户平台-->账户中心-->API安全 中可以设置/看到
查看MCHID(商户号)
方式1:登录微信商户平台-->账户中心-->商户信息 中可以设置/看到
3.复制以下java代码,传入参数即可!
/**
* 移动网站支付:统一下单接口的请求
* @param jsonMap
* @return Map<String,Object>
*/
public static Map<String,String> mWebPay(String body,String out_trade_no,String total_fee,String attach,String spbill_create_ip,String notify_url){
WXPay wxpay = new WXPay(new WeChatConfig());
Map<String, String> data = new HashMap<String, String>();
data.put("body",body);//商品描述
data.put("out_trade_no", out_trade_no);//订单编号
data.put("attach",attach);//自定义内容
data.put("total_fee", total_fee);//总价
data.put("spbill_create_ip", spbill_create_ip);
data.put("notify_url", notify_url);
data.put("trade_type", "MWEB");//此为h5支付
try {
data = wxpay.unifiedOrder(data);//这一步需要对返回结果进行判断,我这没进行判断
if("FAIL".equals(data.get("result_code"))) {
data.put("status", "500");
data.put("msg", data.get("err_code_des"));
}else {
data.put("status", "200");
}
} catch (Exception e) {
data.put("status", "500");
e.printStackTrace();
}
return data;
}
该方法中最主要的类为WXPay(com.github.wxpay.sdk.WXPay),该类中有很多封装好的与微信支付相关的方法,比如退单、查询订单等,届时可以点进去看看就明白了。
按照要求传入参数,正常返回的map中会有prepay_id、mweb_url两个参数,其中mweb_url返回到前段,前段通过
window.location.href = res.mwebUrl;进行跳转即可。(注意:一定要用window.location.href进行跳转,不能直接访问mwebUrl,否则会报 ” 商家参数格式有误,请联系商家解决 “)微信处理完后会异步返回消息到notify_url这个地址,在这里面我们根据微信的返回结果对自己的业务逻辑进行处理。
如何测试h5支付和支付回调?
因为微信h5支付需要在微信商户平台上配置已经备案过的域名,在产品中心-->开发配置-->h5支付域名中配置的域名(可配3个)均可以正常调用微信支付,所以找一个备案好的域名,将其在商户平台配置好。将域名解析到测试的服务上,调用支付接口便可以进行测试。若域名只有一个且正式服务器硬件设施可以,可以在正式服务器上重启一个tomcat(端口不一样即可)作为测试的服务。