一级片大奶子_色又黄又爽18禁免费视频_热久久久久久久_久久久精品一区二区_日韩av不卡在线播放_精品国内自产拍在线观看视频

注冊登錄

微信支付服務商接入小程序指引步驟流程

2018-09-20
導讀:微信支付服務商接入指引 本文主要針對服務商下特約商戶的小程序支付進行講解。(掃碼支付, h5支付大致流程都差不多,了解了小程序支付能夠很快接入其他支付類型) 說明:本文...

微信支付服務商接入指引

本文主要針對服務商下特約商戶的小程序支付進行講解。(掃碼支付, h5支付大致流程都差不多,了解了小程序支付能夠很快接入其他支付類型)

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

支付主體

  • 服務商:擁有支付開發能力的第三方提供商
  • 普通商戶: 擁有開發能力的商戶
  • 特約商戶:服務商下的商戶

    一個商家主體可以在不同服務商下申請特約商戶,每個服務商都會給商家主體在此服務商下一個特約商戶號。

    普通商戶申請需要花費大約300RMB,服務商申請特約商戶不需要費用。

    一個商家主體可以申請 普通商戶,特約商戶。同一個商戶主體申請的普通商戶與在服務商下申請的特約商戶號是獨立的。

    服務商

    服務商下的特約商戶的資金流轉不會直接經過服務商的支付賬戶,最終消費者的資金直接和服務商下的特約商戶進行來往,但是服務商可以查看自己下的特約商戶資金流水。

    服務商小程序開發文檔

    開發支付

    開發之前

    申請注冊服務商,通過之后登錄微信商戶平臺,進入菜單: 服務商功能 --> 特約商戶管理 -->新增商戶(也就是申請服務商下的特約商戶)
    申請如果沒有問題會在三到五天通過,之后可以在特約商戶管理
    下看到服務商自己的特約商戶,我們在開發中需要服務商商戶號及這里的商戶號(特約商戶號)

    支付需要接口:微信統一下單,及提供給微信的回調接口

    統一下單接口

    微信統一下單請求參數

    統一下單請求參數封裝為我們可以處理的對象:

    此處我的命名是: WechatUnifiedorderRequest

    以下是我開發中遇到一些坑,主要是由于微信官方的文檔給的參數很模糊,特別是小程序支付。

    在填充好了WechatUnifiedorderRequest對象后對我們填充的值按照字典排序,連接key進行簽名,以xml格式字符向微信發起請求

    1. 我們需要對對象按照字典序排序

      第一步,設所有發送或者接收到的數據為集合M,將集合M內非空參數值的參數按照參數名ASCII碼從小到大排序(字典序),使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
    2. 字典排序后的字符連接key(需要在微信商戶平臺進行配置建議使用UUID生成32位)
    3. MD5加密簽名,得到sign填充WechatUnifiedorderRequest對象
    4. WechatUnifiedorderRequest轉換為微信需要的xml類型
    5. 發起請求
    6. 得到微信統一下單的響應(是xml字符格式),解析為對象(對返回的響應封裝對象進行處理WechatUnifiedorderResponse),
    7. 對返回的對象進行驗證,通過驗證返回給小程序 需要的參數及簽名小程序調起支付API
    8. 小程序支付成功,微信開始回調在統一下單傳給微信的回調地址
      獲取下單用戶的真實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();
                  /*String methodName = "get"+name.replaceFirst(name.substring(0, 1), name.substring(0, 1)
                          .toUpperCase());*/
                  //通過get方法直接獲取屬性值
                  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解析器解析,在轉為對象的時候我們需要解析

        WechatUnifiedorderResponse對象使用注解

        • @XmlAccessorType(XmlAccessType.FIELD)
          • @XmlRootElement(name = "xml")//解析xml的根元素

            以上的和WechatUnifiedorderRequest是一樣,但是由于需要解析,我們創建CDataAdapter繼承XmlAdapter ,使用注解@XmlJavaTypeAdapter來處理,在WechatUnifiedorderResponse需要處理的域上使用注解

            如下:

             @XmlJavaTypeAdapter(CDataAdapter.class)// 解析
                private String return_code; //返回狀態碼
            CDataAdapter解析
            
            /**
             *
             * 注解使用, 對象與xml轉換的字段需要有 
             *
             * @Author xuelongjiang
             */
            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 {
                      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 "";
                }
            }
            
            

            到此為止,我們已經得到微信統一下單的響應值了,后續的處理不是很復雜。按照文檔不會有很大的坑。

            在做微信支付的時候,難點是以上的:請求參數說明模糊,在經歷幾次的傳參試驗及百度谷歌之后,才明白了參數的具體的使用,其實后續在做掃碼支付的時候,發現掃碼支付解釋的比較清楚,小程序的文檔確實比較坑。

重磅推薦:小程序開店目錄

第一部分:小商店是什么

第二部分:如何開通一個小商店

第三部分:如何登錄小商店

第四部分:開店任務常見問題

第五部分:小商店可以賣什么

第六部分:HiShop小程序特色功能

第七部分:小程序直播

第八部分:小程序收貨/物流

第九部分:小程序怎么結算

第十部分:小程序客服

第十一部分:電商創業

第十二部分:小程序游戲開發

電話咨詢 微信咨詢 預約演示 0元開店
主站蜘蛛池模板: 成年免费观看黄页网站|亚洲毛片免费在线观看|欧美视频一区二区在线|欧美人精品XO|WWW夜片内射视频在观看视频|久久影院免费观看 | 男人视频在线观看|青青青草国产|国产成=a人亚洲精v品无码性色|91深夜|国产chinese精品露脸|日日日日做夜夜夜夜做无码 | 青草国产精品久久久久久|公和我做好爽添厨房中文字幕|99re6这里有精品热视频|六月婷婷精品视频在线观看|女教师办公室被强在线播放|日韩一区二区三区不卡视频 | 中国女人FREEXXXXXXX|一色一伦一区二区三区的区别|亚洲αⅴ无码乱码在线观看性色|怡春院综合|精品人妻无码一区二区三区百度|国产精品wwwwww | 97超碰成人在线|欧美精品一区二区久久婷婷|在线观看免费人成视频播放|久久福利=av|精品一区不卡|久久水蜜桃视频 | 中文字幕高清在线观看|中文字幕一区二区三区门四区五区|中文字幕久久999及|国产亚洲日韩=aV在线播放不卡|精品国产免费看|亚洲tv在线 | 91精品国产综合久久久欧美|色一情一乱一乱一区99=av|国产一区二区小视频|稚嫩小奶娃h文|一级毛片免费观看视频|日本无遮挡边做边爱边摸 | 岛国精品在线观看|欧美丰满高潮xxxx喷水动漫|国内=av网|亚洲精品久久久久久久久|亚洲精品h|亚洲国产视频一区二区 | 91毛片在线观看|人妻=av无码系列一区二区三区|国产乱在线|西西人体www大胆高清仙踪林|九一在线免费观看|精品国产专区 | 天天鲁啊鲁在线看|久久天天躁狠狠躁夜夜免费观看|久久精品国产亚洲=aV麻豆王友容|亚洲亚洲人成综|伊人影视久久|97精品国产手机 | 国产1区在线观看|四房播播成人社区|嫩草影视亚洲|免费毛片在线不卡|久久亚洲精品国产一区最新章节|911免费看片 | 50岁退休熟女露脸高潮|欧美高潮喷水高潮集合|久久久久久久综合|国产视频四区|99麻豆久久久国产精品免费优播|久99久在线 | 天天干在线播放|成人国内精品视频在线观看|最近2019年中文字幕大全|亚洲一区免费在线观看|久久青青草原亚洲=aV无码麻豆|三区四区 | 国产日本无码视频韩国网站写真|国产又色又爽又刺激在线播放|亚洲精品456在线播放牛牛影院|久久久亚洲国产|午夜视频成人|国产伦孑沙发午休精品 | 国产亚洲综合日韩一区|亚洲成人一区二区三区在线观看|亚洲精品日本久久一区二区三区|国产91=av视频在线观看|97色在线观看|精品国产香蕉伊思人在线 | 日韩人妻无码精品=a片免费不卡|国产亚洲综合99久久系列|国产影视精品一区二区三区|午夜理论片一级毛片免费|亚洲,国产,欧美在线|久久曰视频 | 亚洲精品一二三|一本色道久久综合狠狠躁邻居|国产精品乱码一二三区的特点|国产粉嫩高中无套进入|亚洲欧美日韩愉拍自拍|2017男人天堂手机在线 | 国产日本无码视频韩国网站写真|国产又色又爽又刺激在线播放|亚洲精品456在线播放牛牛影院|久久久亚洲国产|午夜视频成人|国产伦孑沙发午休精品 | 久久久999精品免费|99九九99九九九视频精品|国产高清区|一二三四在线看日本高清|国产乱轮视频|国产精品一区二区欧美 | 无码专区中文字幕无码野外|亚洲爱婷婷色婷婷五月|成人99视频|欧美人善交videosg|免费看片一区|#NAME? | 日本亚洲欧洲精品|19禁无遮挡啪啪无码网站性色|久久亚洲=aⅴ无码精品色午夜|91tv永久入口|91九色鹿精品国产综合久久香蕉|91亚洲福利 | 日韩免费二区|日韩欧美国产激情在线播放|日本hd高清xxxxvideos|亚洲色偷偷色噜噜狠狠99|亚洲综合p|新版天堂资源中文www连接 | 日韩三级在线免费观看|久久艹艹|色爱综合另类图片=av|国内久久精品视频|xx69在线观看|亚洲国产一区二区精品 | 一区二区三区视频免费看|久久爱伊人|日本大尺度吃奶做爰久久久绯色|日韩精品视频免费在线观看|亚洲系列一区中文字幕|天堂视频一区二区 | 99久久无码一区人妻|亚洲第一欧美|欧美一级欧美一级高清|99热这里只有精品9|欧美成人=a猛片在线观看|国产日产欧产美韩系列麻豆 | 精品视频在线一区二区在线|码亚洲中文无码=av在线|九九九国产精品成人免费视频|国产露脸对白88=av|天天艹日日干|中文字幕久久精品一二三区 | 国内揄拍国内精品人妻浪潮=aV|亚洲人成在线观看一区二区|日韩一区欧美|毛片在线播放=a|亚洲=av最新天堂网址|vr视频高清3d羞羞的铁拳 | 99中文视频|成人手机在线免费观看|久久成人精品|日韩72页|秋霞麻豆|999视频网站 | 亚洲综合另类小说色区色噜噜|国产奂费一级毛片|色七综合|草蹓视频在线观看|伊人欧美|精品成人一区二区三区免费视频 | 国产人成精品香港三级在线|国产乱人伦偷精品视频免观看|男女无套免费视频软件|中文无码一区二区不卡αv|91短视频免费|亚洲美女精品区人人人人 | 欧美人人|91精品久久久久久综合|日本一区二区三区视频视频|欧美老熟妇乱子伦视频|91精品国产99久久久久|国产不卡三区 | 日韩免费v片在线观看|国产一区精品二区|777777在线视频观看|国产一区二区色|4438x五月|日韩精品一区二区在线视频 | 日韩性生活一级|日韩久久无码一区二区|欧美胖老太一级毛片|欧美精品一区二区精品久久|国产精品日韩在线观看|亚洲=av线=av无码=av岛国片 | 日韩精品免费一区|日本人与黑人做爰视频网站|国产免费黄视频在线观看|亚洲男人天堂一区|69视频在线免费观看|视频三区二区一区 | 精品久久久久久亚洲综合网站|c=aopeng人人|蜜桃婷婷|国产高潮抽搐在线观看|中文字幕亚洲专区|第四色中文综合网 | 99久久无码一区人妻|亚洲第一欧美|欧美一级欧美一级高清|99热这里只有精品9|欧美成人=a猛片在线观看|国产日产欧产美韩系列麻豆 | 91麻豆国产自产在线观看|曝光无码有码视频专区|丁香激情综合网|国产精品无码午夜免费影院|成年人二级毛片|中文字幕第4页 | 岛国片在线播放97|欧美成人精品一级在线观看|久久99精品久久久久久久|一区二区三区影院|国产=a久|成人一区久久 | 亚洲=a级大片|青草伊人久久综在合线亚洲观看|我爱=av网站|91福利视频免费观看|果冻传媒剧国产免费入口今日更新|老师露双奶头无遮挡挤奶视频 | 久久人人精品|亚洲综合欧美在线一区在线播放|高清欧美性猛交XXXX黑人猛交|国产欧美一区二区三区久久|黄色毛片=a|欧洲内射XXX高清 | 久久日=av|91精品国产闺蜜国产在线闺蜜|91视频免费观看网站|99精品国产高清在线观看|亚洲女子=a中天字幕|日韩=av黄色在线观看 |