前言:
APP微信支付对于新手来说真的是不知道从哪里下手,我们刚创建的开发团队自己想到的项目idea,需要用到支付功能,但是作为后台开发者的我来说,这次的坑真的是摔惨了!说起来都是微信文档的敷衍报错!文档描述及其简略,很多细节都没有说清楚,磨了几个星期才终于搞出来了。话不多说开始记坑!
开发步骤:
1、申请微信开放平台,申请过程不赘述,到“管理中心“——”移动应用”下创建自己的移动应用,获取开放平台分配的APPID。
创建完成后在应用上点击“查看”,申请支付功能,填写完整基本信息,再跟安卓端的同事拿到Android应用的应用签名和包名,填入开发信息中。
2、申请微信商户平台,申请过程同样不赘述,获取商户号——mch_id,在“api安全”——“api秘钥”中设置商户平台api秘钥,需要先在本机浏览器安装证书才能进行这些安全操作。
3、做完上述操作就开始进入代码正题(使用springboot搭建的maven项目)。
第一步:在配置文件application.yml中添加响应配置
wechat:
pay:
# 统一下单、生成预支付订单接口
url: https://api.mch.weixin.qq.com/pay/unifiedorder
# 微信支付回调接口
notifyWeiXinPay: http://自己的域名/自己的请求路径
# 微信开放平台appId
appId: 修改成自己的appid
# 商户平台api密钥
apiSecret: 修改成自己的apiSecret
# 商户号
mchId: 修改成自己的商户号
并在pom文件中添加微信支付需要用到的依赖
<!-- 微信支付依赖包 -->
<dependency>
<groupId>com.github.liyiorg</groupId>
<artifactId>weixin-popular</artifactId>
<version>2.8.5</version>
</dependency>
<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
第二步:添加WeChatUtil类,需要在pom.xml文件中添加lombok依赖,用来使用@Data注解,省去每个都属性都要写getter和setter的繁琐。
@Component
@Data
public class WeChatUtil {
@Value("${wechat.pay.url}")
private String url;
@Value("${wechat.pay.notifyWeiXinPay}")
private String notifyWeiXinPay;
@Value("${wechat.pay.refundUrl")
private String refundUrl;
@Value("${wechat.pay.businessPayUrl}")
private String businessPayUrl;
@Value("${wechat.pay.appId}")
private String appId;
@Value("${wechat.pay.apiSecret}")
private String apiSecret;
@Value("${wechat.pay.mchId}")
private String mchId;
}
第三步:添加微信数据处理类——PayCommonUtil
@Component
public class PayCommonUtil {
//微信参数配置
public static String API_SECRET;
@Value("${wechat.pay.apiSecret}")
public void setApiKey(String apiSecret) {
API_SECRET = apiSecret;
}
/**
* @return a
* @Author weigaosheng
* @Description 请求xml组装
* @Date 8:53 2019/2/2
* @Param parameters
**/
public static String getRequestXml(SortedMap<String,Object> parameters){
StringBuffer sb = new StringBuffer();
sb.append("<xml>");
Set es = parameters.entrySet();
Iterator it = es.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String key = (String)entry.getKey();
String value = (String)entry.getValue();
if ("attach".equalsIgnoreCase(key)||"body".equalsIgnoreCase(key)||"sign".equalsIgnoreCase(key)) {
sb.append("<"+key+">"+"<![CDATA["+value+"]]></"+key+">");
}else {
sb.append("<"+key+">"+value+"</"+key+">");
}
}
sb.append("</xml>");
return sb.toString();
}
/**
* @return a
* @Author weigaosheng
* @Description 生成签名
* @Date 8:53 2019/2/2
* @Param characterEncoding parameters
**/
public static String createSign(String characterEncoding,SortedMap<String,Object> parameters){
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序&#