当前位置: 首页 > 微信相关

小程序开发微信支付服务商接入教程

发布日期:2020-08-12 09:10:24 分类:微信相关 阅读()来源:网络收集

好东西要多分享:

做网站就上魔艺客
摘要:本文主要针对服务商下特约商户的小程序支付进行讲解。(扫码支付, h5支付大致流程都差不多,了解了小程序支付能够很快接入其他支付类型)

小程序开发微信支付服务商接入指引

本文主要针对服务商下特约商户的小程序支付进行讲解。(扫码支付, h5支付大致流程都差不多,了解了小程序支付能够很快接入其他支付类型)

说明:本文中的支付都是指在服务商模式下

支付主体

服务商:拥有支付开发能力的第三方提供商

普通商户: 拥有开发能力的商户

特约商户:服务商下的商户

一个商家主体可以在不同服务商下申请特约商户,每个服务商都会给商家主体在此服务商下一个特约商户号。

普通商户申请需要花费大约300RMB,服务商申请特约商户不需要费用。

一个商家主体可以申请 普通商户,特约商户。同一个商户主体申请的普通商户与在服务商下申请的特约商户号是独立的。

服务商

服务商下的特约商户的资金流转不会直接经过服务商的支付账户,最终消费者的资金直接和服务商下的特约商户进行来往,但是服务商可以查看自己下的特约商户资金流水。

开发支付

开发之前

申请注册服务商,通过之后登录微信商户平台,进入菜单: 服务商功能 --> 特约商户管理 -->新增商户(也就是申请服务商下的特约商户)

申请如果没有问题会在三到五天通过,之后可以在特约商户管理下看到服务商自己的特约商户,我们在开发中需要 服务商商户号及这里的商户号(特约商户号)

支付需要接口:微信统一下单,及提供给微信的回调接口

微信官方给的业务流程图:

可以很清晰的理解业务流程走向。

统一下单接口

微信统一下单请求参数

统一下单请求参数封装为我们可以处理的对象:

此处命名是: WechatUnifiedorderRequest

以下开发中遇到一些坑,主要是由于微信官方的文档给的参数很模糊,特别是小程序支付。

在填充好了WechatUnifiedorderRequest对象后对我们填充的值按照字典排序,连接key进行签名,以xml格式字符向微信发起请求

我们需要对对象按照字典序排序
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
字典排序后的字符连接key(需要在微信商户平台进行配置建议使用UUID生成32位)
MD5加密签名,得到sign填充WechatUnifiedorderRequest对象
WechatUnifiedorderRequest转换为微信需要的xml类型

发起请求

得到微信统一下单的响应(是xml字符格式),解析为对象(对返回的响应封装对象进行处理WechatUnifiedorderResponse),
对返回的对象进行验证,通过验证返回给小程序 需要的参数及签名 小程序调起支付API
小程序支付成功,微信开始回调在统一下单传给微信的回调地址

获取下单用户的真实IP

/**
* 获取用户真实IP
* 如果有**,获取真实客户端IP
* @param request
* @return
*/
public static String getRealId(HttpServletRequest request){
String xForwardedForHeader= request.getHeader(X-Forwarded-For);
if(xForwardedForHeader == null){
return request.getRemoteAddr();
}else {
return new StringTokenizer(xForwardedForHeader, ,).nextToken().trim();
}
}按照字典序排序

/**
* 使用java反射机制,动态获取对象的属性和参数值,排除值为null的情况,并按字典序排序
* @param object
* @return
*/
public static String getSortMap(Object object) throws Exception{
//1.得到属性的名称及值 如果为null不存入map
Field [] fields = object.getClass().getDeclaredFields();
Map map = new HashMap<>();
for(Field field : fields){
String name = field.getName();
field.setAccessible(true);
Object value = field.get(object);
if (value != null){
map.put(name, value.toString());
}
}
//排序
Map sortMap = new TreeMap(
new Comparator() {
@Override
public int compare(String arg0, String arg1) {
return arg0.compareTo(arg1);
}
});
sortMap.putAll(map);
StringBuilder sortFeil = new StringBuilder();
//得到键值对的格式(即key1=value1&key2=value2…
sortMap.forEach((k,v)-> {
sortFeil.append(k+=+v+&);
});
//移除最后一个 &
sortFeil.deleteCharAt(sortFeil.length()-1);
return sortFeil.toString();

}

使用字典序返回的字符连接key,使用MD5进行加密,得到sign

WechatUnifiedorderRequest转换为微信需要的xml类型

在WechatUnifiedorderRequest对象上使用注解

@xmlAccessorType @xmlAccessorType(XmlAccessType.FIELD)

@xmlRootElement @xmlRootElement(name =xml) ( name = xml : WechatUnifiedorderReques对象转换为xml的根名称)

/**

* 微信统一下单请求对象

*

* @Author xuelongjiang

*/

@XmlAccessorType(XmlAccessType.FIELD)

@XmlRootElement(name = xml)//xml的根元素

public class WechatUnifiedorderRequest implements Serializable{

}

对象转换为xml字符

引入包:import javax.xml.bind.JAXBContext
/**
* 对象转换为xml
* @param object
* @return
*/
public static String objectToXml(Object object){
StringWriter sw = new StringWriter();
try {
JAXBContext context = JAXBContext.newInstance(object.getClass());
Marshaller marshaller = context.createMarshaller();
marshaller.marshal(object,sw);
}catch (Exception e){
e.printStackTrace();
logger.error(对象解析xml出现异常,对象为+object.toString());
}
return sw.toString();
}

得到微信统一下单的响应(是xml字符格式),解析为对象
封装对象:WechatUnifiedorderResponse 表示微信统一下单响应的对象。
请求微信统一下单返回示例:

;
}
}


到此为止,我们已经得到微信统一下单的响应值了,后续的处理不是很复杂。按照文档不会有很大的坑。

在做微信支付的时候,难点是以上的:请求参数说明模糊,在经历几次的传参试验及百度谷歌之后,才明白了参数的具体的使用,其实后续在做扫码支付的时候,发现扫码支付解释的比较清楚。


相关资讯: 微信小程序 微信小程序开发教程

声明: 文章内容及图片部分全部摘自网络,在此分享供读者参考和借鉴,不代表酷雷的观点。文章、图片等内容如涉嫌侵权,请联系我们删除,谢谢!带有原创标签的属于酷雷原创文章,未经允许不得转载!

标签:

我要说一说

加载中~

相关推荐

您好,很高兴为您服务!
广告合作
投诉建议
联系站长

客服热线:15821432298

扫码加好友,优惠等你来!