范围:深圳亚博app开发,软件定制开发,亚博app软件开发公司,深圳软件外包公司.TEL:3447249690
当前位置:首页 > app小程序

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

07-02 亚博APP
摘要:本文首要针对办事商下特约商户的小法式付出进行讲授。(扫码付出, 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 暗示微信同一下单响应的对象。 要求微信同一下单返回示例: ![CDATA[10000101]]>

参数值用XML转义便可,CDATA标签用在申明数据不被XML解析器解析,在转为对象的时辰我们需要解析。

public class CDataAdapter extends XmlAdapter { private static Logger logger = LoggerFactory.getLogger(CDataAdapter.class); /** * Do-nothing constructor for the derived classes. */ protected CDataAdapter() { super(); } /** * Convert a value type to a bound type. * * @param v The value to be converted. Can be null. * @throws Exception if there\'s an error during the conversion. The caller is responsible for * reporting the error to the user through {@link ValidationEventHandler}. */ @Override public String unmarshal(String v) throws Exception { if(.equals(v)){ return ; } String v1 = null; String v2 = null; String subStart = = 0){ v1 = v.substring(subStart.length(),v.length()); }else { re亚博turn v; } String subEnd = ]]>; int b = v1.indexOf(subEnd); if(b>= 0){ v2 = v1.substring(0,b); } return v2; } /** * Convert a bound type to a value type. * * @param v The value to be convereted. Can be null. * @throws Exception if there\'s an error during the conversion. The caller is responsible for * reporting the error to the user through {@link ValidationEventHandler}. */ @Override public String marshal(String v) throws Exception { logger.info(对象转换xml:+); return ; } }

到此为止,我们已获得微信同一下单的响应值了,后续的处置不是很复杂。依照文档不会有很年夜的坑。

在做微信付出的时辰,难点是以上的:要求参数申明恍惚,在履历几回的传参实验和百度谷歌以后,才大白了参数的具体的利用,其实后续在做扫码付出的时辰,发现扫码付出注释的比力清晰。

相干资讯:微信小法式微信小法式开辟教程

版权保护: 本文由 亚博app开发 原创
转载请保留链接: http://www.cqsLin.com

关于我们      深圳亚博定制开发软件有限公司,自2013年成立以来,为上千家企业提供软件外包、系统软件开发、亚博app开发、微信公众号开发、深圳亚博小程序开发等各种优秀的软件定制开发服务.关键词:软件外包公司、手机软件开发、app制作开发、手机亚博app开发、小程序开发公司【TEL】:3447249690 微信:3447249690 QQ:3447249690
  • 1578文章总数
  • 13访问次数
  • 建站天数