029-89503350
全部网站建设自助建站网站空间网站优化网站推广SEO头条SEO问答优化百科微信开发微信营销
上一篇 没有啦

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

<微信开发>     编辑:西安网站制作公司    DATE:2018-10-22

本篇主要针对服务商下特约商户的微信小程序支付进行解说。(扫码支付, 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 = 
      int a = v.indexOf(subStart);
      if(a>= 0){
          v1 = v.substring(subStart.length(),v.length());
      }else {
          return 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 ;
    }
}

       到此为止,咱们现已得到微信一致下单的响应值了,后续的处理不是很杂乱。依照文档不会有很大的坑。以上就是关于微信支付服务商接入的微信小程序开发教程。

       本文由麦欧科技的西安微信开发团队网络整编而成,不代表本站观点。如需了解更多微信开发的文章、新闻、资讯和开发技巧、案例、各种微信开发知识百科请进入:http://www./slist/sc174715_list.html ,而且能够与麦欧科技专业客服进行一对一解答。
相关热点资讯
  麦欧官网所有资料仅供参考 · 不作为签约和履约的承诺  法律顾问 · 陕西臻理律师事务所