一、产品成果



二、前言

本次支付宝小程序和以前支付宝小程序不同是,以前小程序主体就是个普通的小程序,这次我们是站在第三方ISV(服务商)角度来进行开发。
ISV 帮助商户开发小程序时可使用的两种开发模式:

  1. 模板开发模式(我们这次方案)
  2. 代开发模式

模板开发模式支持 ISV 通过 API 批量处理商户小程序,所以该模式比较适合有大量同类型商家客户的ISV;代开发模式则比较适合商户定制化小程序。

2.1 模板开发模式

模板开发模式下 ISV 可以通过 API 接口批量处理商家小程序,比如 ISV 通过模板开发模式服务了 1 万个不同的餐饮小程序,如果需要对这 1 万个不同的小程序做版本升级时,在模板开发模式下,可以实现用 API 接口构建、提审、上架这 1 万个不同的小程序。在模板开发模式下商户把自己的小程序授权给 ISV 的三方应用,让 ISV 去帮商户实现商户小程序的代码构建、提审以及商户小程序上架。在商户把商户小程序授权给 ISV 的三方应用后,商户小程序的代码只能通过服务商三方应用下的小程序模板代码去构建。

业务特点:

开发流程:ISV 先开发小程序模板的代码,然后通过小程序模板的代码去构建商户小程序的代码;
快速开通:通过服务市场,商户仅需完成订购,即完成商户小程序授权,通过模板快速生成自有商户小程序;
批量维护:ISV 可代商户实现小程序的快速批量更新。

ISV 想要开发自己的平台小程序,大体上分为三个步骤:

服务商入驻开放平台;
创建平台小程序;
开发、测试、提审、上架小程序。

2.2 模板开发模式接入流程

2.2.1 创建第三方应用

2.2.2 创建第三方模板

2.2.3 ISV开发模板小程序

小程序模板在 IDE 调试时,所需要用到的服务端接口(用户授权、订单接口等),需要使用第三方应用的 AppId 和app_auth_token 进行测试。小程序模板不能直接调用后端接口,小程序模板授权给三方应用后,三方应用可以代小程序模板调用后端接口,具体调用方式为:三方应用AppId + 三方应用秘钥 + 小程序模板授权的 app_auth_token。
开发完后,需要将小程序模板提交审核

2.2.4 商户授权小程序

1.Isv发起授权(二维码方式)如下图:
2.应用市场,商户订阅服务

支付宝开放平台商家授权应用会多出一条授权记录

授权成功后,开发权限就托管给第三方,自己不能在此基础上进行开发管理


2.3 ISV实施商户小程序

条件:商户已经自己建立了小程序,我们需要通过后台构建商户小程序

构建商户小程序
小程序提交审核
小程序上架
小程序二维码生成(体验码,推广码)
小程序下架

审核消息推送处理,同步升级原因


三、支付宝消息处理

消息服务是支付宝开放平台为提高应用API调用效率而推出面向开发者的一项消息服务,根据数据流向的不同分为:主动推送服务( From蚂蚁 )和消息回流服务( To蚂蚁 )。支付宝开放平台消息服务接入文档地址:https://docs.open.alipay.com/10381

3.1 接入方式

1.webSocket长连接
2.http(s)接入【我们使用这种】

注意:支付宝平台配置应用网关地址(消息回调地址)

3.2 消息日志
审核拒绝:
2020-01-03 14:57:10.876 INFO [DubboServerHandler-10.1.25.217:20880-thread-12] alipay_mini_program_error 商圈支付宝小程序消息处理 msg:{"charset":"UTF-8","biz_content":"{\"mini_app_id\":\"2019112869472474\",\"bundle_id\":
\"com.alipay.alipaywallet\",\"audit_reason\":\"1. 纯介绍文字的小程序无实际服务内容不准入: 小程序内容为纯黄页,纯广告、图片信息展示,无功能服务,请添加功能服务(例如购买、一键拨打咨询、领取优惠券等功能)<br> 2. 应用描述没有介绍清楚小程序服务内容:
应用描述没有介绍小程序的服务内容,请从服务类介绍文案出发,写清楚小程序主要提供什么服务,提供什么产品服务<br> \",\"mini_app_version\":\"0.0.7\"}","utc_timestamp":"1578034629715","sign":"uNYpcizxYnCJEGK0qwIJaJSmiM1GgsXUmi4wllRNiihwtXt
ujqrqG4CF+ZACGIhtkeyafTdxezDi+A+anrC++n53wuPsQknJDuVF9zxo8peneV97xdrUxke9Qnx3CL8/j+MXav7WkWIdRHk8POwnhPh3+vWForQc/81mSAYbUlEKex+dgVEWfzHBM0DiKbrLWcxtU9p4G2c3xoKgC8oO3aHZe3ad1vP1yvh6OVyjUT+DCiebR+DsxyBpgrpWfZ4eGjv6
0dzu95ShGqdB/svjZsN6g6WIFxnxy77RnP3oheyWPGQJqe/wCFcVZ1sjPBO3gVn5inqNchJtMgBicPTF3w==","app_id":"2019112669461031","version":"1.1","sign_type":"RSA2","notify_id":"2020010300262133505019411084005991","msg_method":
alipay.open.mini.version.audit.rejected"} 审核通过:
2020-01-03 15:05:20.366 INFO [DubboServerHandler-10.1.25.217:20880-thread-13] alipay_mini_program_error 商圈支付宝小程序消息处理 msg:{"charset":"UTF-8","biz_content":"{\"mini_app_id\":\"2019112769470319\",\"bundle_id\":
\"com.alipay.alipaywallet\",\"mini_app_version\":\"0.0.4\"}","utc_timestamp":"1578035119725","sign":"hqPi/R4S1D1z/wwIBpHo0wPjH6BOPdPHN4ih2nDDVCq1roByBTfqnKxBb5gaeEtcG2rjHed4MQRE1nnAFwlqB5hr5i/PNyKE4kFBhnu5qrVKiyIo1P
2/Tk7XkwXj8rLlNPIz02tElTuiG9sgrkH+2QAR6aRfrlp1PSR2Gty2/UkSy3jkI8S+AIvW8UUSy3LtFCIs1HaPIQrwBpZ0o8GcUPEMiu6WC6W6PeqPiYTDUjmwlVYRVZ3Y1Or9+lQcyZpEoRIN8+gcpCvyXuG2SFebBOoCc0guGNL092qHaKl05DmHw7b4LbrIb1G9CjUyD264xOIfZPd3
VZ4c47LanbegJQ==","app_id":"2019112669461031","version":"1.1","sign_type":"RSA2","notify_id":"2020010300262150519018683726102302","msg_method":"alipay.open.mini.version.audit.passed"}
3.3 验签
charset=GBK
biz_content={"app_auth_token":"197002BB1bcb984cc0ab4c5ebed9c592df6acX80","auth_app_id":"2016062401550921","user_id":"2088102285927804","app_id":"1970121701099429"}
utc_timestamp=1518170340170
sign=ABC
app_id=1970121701099429
version=1.1
sign_type=RSA2
notify_id=2798c9cf5f88f24bb7ab6a94733cab1m3l
msg_method=alipay.open.auth.appauth.cancelled/*** 对报文进行验签* @param content 验签内容* @param sign 签名值* @param publicKey 支付宝公钥* @param charset 验签字符集* @param signType 签名算法* @return 验签结果。true: 验签通过; false: 验签失败* @throws AlipayApiException*/
public static boolean rsaCheck(String content, String sign,String publicKey, String charset, String signType)
3.4 消息幂等性处理

由于消息存在重试机制,同一笔消息(相同notify_id)可能多次发送(网络原因、商户服务器原因、或者商户接受处理成功但并未按要求打印success字符串等),消息接收方需要对同一个notifyId的多次消息投递实现幂等。若之前相同的notify_id已处理成功。直接返回success字符串即可;

3.5 消息重投递

一般情况下,25小时以内完成8次通知,除了第一次是实时投递外,后续的每次重试都会间隔一段时间,间隔频率一般是:2m,10m,10m,1h,2h,6h,15h(第二次消息投递是在第一次投递失败后的2分钟;第三次投递是在第二次投递失败后的10分钟,以此类推)


四、支付宝ISV服务商实施商户小程序接口

4.1 BusinessMiniProgramBuildFacade.java
package com.dfire.soa.wechat.facade.isv;import com.alibaba.fastjson.JSON;
import com.alipay.api.AlipayClient;
import com.alipay.api.request.AlipayOpenMiniVersionBuildQueryRequest;
import com.alipay.api.request.AlipayOpenMiniVersionDeleteRequest;
import com.alipay.api.request.AlipayOpenMiniVersionUploadRequest;
import com.alipay.api.response.AlipayOpenMiniVersionBuildQueryResponse;
import com.alipay.api.response.AlipayOpenMiniVersionDeleteResponse;
import com.alipay.api.response.AlipayOpenMiniVersionUploadResponse;
import com.twodfire.exception.BizException;
import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;/*** User: lanxinghua* Date: 2019/12/25 19:47* Desc: ISV小程序模板服务-商户小程序构建* 文档地址:https://docs.alipay.com/mini/isv/fir962*/
@Service
public class BusinessMiniProgramBuildFacade extends IsvBaseFacade{private static final String VERSION_CREATE_SUCCESS = "6";/*** 调用alipay.open.mini.version.upload 小程序基于模板上传版本(未调通,模板需要审核通过)* @param templateVersion* @param entityId* @param memberSystemId* @param appId* @param appVersion* @param appName*/public void buildMiniProgramByTemplate(String templateVersion, String entityId, String memberSystemId,String appId, String appVersion, String appName){try {AlipayClient alipayClient = getAlipayClient();AlipayOpenMiniVersionUploadRequest request = new AlipayOpenMiniVersionUploadRequest();request.setBizContent("{" +"\"template_version\":\""+ templateVersion +"\"," +"\"ext\":\"{\\\"extEnable\\\": true, \\\"extAppid\\\":"+ appId +"," +"\\\"ext\\\": {\\\"appId\\\": \\\"" + appId + "\\\", \\\"appName\\\": \\\""+appName+"\\\", \\\"entityId\\\": \\\""+entityId+"\\\", \\\"memberSystemId\\\": \\\""+memberSystemId+"\\\"}, " +"\\\"window\\\": {\\\"navigationBarTitleText\\\": \\\""+appName+"\\\"}}\"," +"\"template_id\":\""+ aliPayAppProperties.getTemplateId() +"\"," +"\"app_version\":\""+appVersion+"\"," +"\"bundle_id\":\"com.alipay.alipaywallet\"" +"  }");String appAuthToken = getAppAuthToken(appId);request.putOtherTextParam("app_auth_token", appAuthToken);AlipayOpenMiniVersionUploadResponse response = alipayClient.execute(request);checkRequestResult(response);}catch (Exception e){throw new BizException(e.getMessage());}}/*** 构建查询接口 alipay.open.mini.version.build.query  接口轮询(建议3-5秒)* return:create_status  0-构建排队中;1-正在构建;2-构建成功;3-构建失败;5-构建超时;6-版本创建成功*/public boolean versionBuildSuccess(String appId, String appVersion){Boolean versionCreateSuccess = false;for (int i = 1; i < 6; i++) {try {AlipayClient alipayClient = getAlipayClient();AlipayOpenMiniVersionBuildQueryRequest request = new AlipayOpenMiniVersionBuildQueryRequest();request.setBizContent("{" +"\"app_version\":\""+appVersion+"\"," +"\"bundle_id\":\"com.alipay.alipaywallet\"" +"  }");String appAuthToken = getAppAuthToken(appId);request.putOtherTextParam("app_auth_token", appAuthToken);AlipayOpenMiniVersionBuildQueryResponse response = alipayClient.execute(request);checkRequestResult(response);if (VERSION_CREATE_SUCCESS.equals(response.getCreateStatus())){versionCreateSuccess = true;break;}try {TimeUnit.SECONDS.sleep(10 * i);}catch (Exception sleepE){sleepE.printStackTrace();}}catch (Exception e){continue;}}return versionCreateSuccess;}/*** 删除商户小程序版本 alipay.open.mini.version.delete* 有开发状态的版本才能被删除,默认最多允许20个开发中的版本*/public void delAppVersion(String appId, String appVersion){try {AlipayClient alipayClient = getAlipayClient();AlipayOpenMiniVersionDeleteRequest request = new AlipayOpenMiniVersionDeleteRequest();request.setBizContent("{" +"\"app_version\":\""+appVersion+"\"," +"\"bundle_id\":\"com.alipay.alipaywallet\"" +"  }");String appAuthToken = getAppAuthToken(appId);request.putOtherTextParam("app_auth_token", appAuthToken);AlipayOpenMiniVersionDeleteResponse response = alipayClient.execute(request);checkRequestResult(response);}catch (Exception e){throw new BizException(e.getMessage());}}
}

4.2 BusinessMiniProgramAuditFacade.java
package com.dfire.soa.wechat.facade.isv;import com.alibaba.fastjson.JSON;
import com.alipay.api.AlipayClient;
import com.alipay.api.FileItem;
import com.alipay.api.request.AlipayOpenMiniVersionAuditApplyRequest;
import com.alipay.api.request.AlipayOpenMiniVersionAuditedCancelRequest;
import com.alipay.api.request.AlipayOpenMiniVersionDetailQueryRequest;
import com.alipay.api.response.AlipayOpenMiniVersionAuditApplyResponse;
import com.alipay.api.response.AlipayOpenMiniVersionAuditedCancelResponse;
import com.alipay.api.response.AlipayOpenMiniVersionDetailQueryResponse;
import com.dfire.consumer.util.LoggerUtil;
import com.dfire.soa.thirdInternal.common.constants.BusinessMiniProgramStatusEnum;
import com.dfire.soa.thirdInternal.common.domain.miniprogram.BusinessMiniprogramAuditBo;
import com.dfire.soa.wechat.exception.WeChatException;
import com.dfire.soa.wechat.logger.LoggerMarkers;
import com.dfire.soa.wechat.logger.WechatLoggerFactory;
import org.springframework.stereotype.Service;/*** User: lanxinghua* Date: 2019/12/25 20:04* Desc: ISV小程序模板服务-商户小程序审核* 文档地址:https://opendocs.alipay.com/mini/isv/kow82t*/
@Service
public class BusinessMiniProgramAuditFacade extends IsvBaseFacade {/***  商户小程序提交审核 alipay.open.mini.version.audit.apply*  必填字段一个都不能少,提审上架后信息无法修改了*/public String auditApply(String appId, String appVersion, String appName, String desc, BusinessMiniprogramAuditBo auditBo) {String resultMsg = null;LoggerUtil.info(WechatLoggerFactory.ALIPAY, LoggerMarkers.ALIPAY_MINI_PROGRAM_INFO, "提交审核:" + appName);AlipayOpenMiniVersionAuditApplyResponse response = null;try {AlipayClient alipayClient = getAlipayClient();AlipayOpenMiniVersionAuditApplyRequest request = new AlipayOpenMiniVersionAuditApplyRequest();request.setAppVersion(appVersion);request.setAppName(appName);request.setVersionDesc(desc);// 小程序服务区域类型request.setRegionType("CHINA");request.putOtherTextParam("app_auth_token", getAppAuthToken(appId));response = alipayClient.execute(request);if ("CAN_NOT_SUBMIT_WITH_AUDIT_GRAY".equals(response.getSubCode()) || "CAN_NOT_SUBMIT_WITHOUT_INIT".equals(response.getSubCode())){resultMsg = response.getSubMsg();BusinessMiniProgramStatusEnum statusEnum = BusinessMiniProgramStatusEnum.getByType(auditBo.getAppStatus());switch (statusEnum){case AUDIT_REJECT:{ // 撤销当前审核失败的版本cancelAudited(appId, auditBo.getCurrentVersion());break;}case RELEASE:case WAIT_RELEASE:{break;}default:{break;}}}checkRequestResult(response);}catch (Exception e){LoggerUtil.error(WechatLoggerFactory.ALIPAY, LoggerMarkers.ALIPAY_MINI_PROGRAM_INFO, "提交审核失败", e);return e.getMessage();}return resultMsg;}/*** 小程序查询审核状态 alipay.open.mini.version.detail.query* INIT-开发中* AUDITING-审核中* WAIT_RELEASE-审核通过* AUDIT_REJECT-审核驳回* RELEASE-已上架* GRAY-灰度中* OFFLINE-下架*/public void queryAuditDetail(String appId, String appVersion){try {AlipayClient alipayClient = getAlipayClient();AlipayOpenMiniVersionDetailQueryRequest request = new AlipayOpenMiniVersionDetailQueryRequest();request.setBizContent("{" +"\"app_version\":\""+appVersion+"\"," +"\"bundle_id\":\"com.alipay.alipaywallet\"" +"  }");String appAuthToken = getAppAuthToken(appId);request.putOtherTextParam("app_auth_token", appAuthToken);AlipayOpenMiniVersionDetailQueryResponse response = alipayClient.execute(request);checkRequestResult(response);}catch (Exception e){e.printStackTrace();}}/*** 商户小程序撤回审核  alipay.open.mini.version.audited.cancel* 审核状态的情况下才能退回开发*/public void cancelAudited(String appId, String appVersion){try {AlipayClient alipayClient = getAlipayClient();AlipayOpenMiniVersionAuditedCancelRequest request = new AlipayOpenMiniVersionAuditedCancelRequest();request.setBizContent("{" +"\"app_version\":\""+appVersion+"\"," +"\"bundle_id\":\"com.alipay.alipaywallet\"" +"  }");String appAuthToken = getAppAuthToken(appId);request.putOtherTextParam("app_auth_token", appAuthToken);AlipayOpenMiniVersionAuditedCancelResponse response = alipayClient.execute(request);checkRequestResult(response);}catch (Exception e){e.printStackTrace();}}
}

4.3 BusinessMiniProgramOnlineFacade.java
package com.dfire.soa.wechat.facade.isv;import com.alipay.api.AlipayClient;
import com.alipay.api.request.AlipayOpenMiniVersionGrayCancelRequest;
import com.alipay.api.request.AlipayOpenMiniVersionGrayOnlineRequest;
import com.alipay.api.request.AlipayOpenMiniVersionOnlineRequest;
import com.alipay.api.response.AlipayOpenMiniVersionGrayCancelResponse;
import com.alipay.api.response.AlipayOpenMiniVersionGrayOnlineResponse;
import com.alipay.api.response.AlipayOpenMiniVersionOnlineResponse;
import org.springframework.stereotype.Service;/*** User: lanxinghua* Date: 2019/12/25 20:14* Desc: ISV小程序模板服务-商户小程序上架* 文档地址:https://opendocs.alipay.com/mini/isv/mkqqhl*/
@Service
public class BusinessMiniProgramOnlineFacade extends IsvBaseFacade {/***  商户小程序灰度上架 alipay.open.mini.version.gray.online*/public void grayOnline(String appId, String appVersion){try {AlipayClient alipayClient = getAlipayClient();AlipayOpenMiniVersionGrayOnlineRequest request = new AlipayOpenMiniVersionGrayOnlineRequest();request.setBizContent("{" +"\"app_version\":\""+appVersion+"\"," +"\"gray_strategy\":\"p10\"," +"\"bundle_id\":\"com.alipay.alipaywallet\"" +"  }");request.putOtherTextParam("app_auth_token", getAppAuthToken(appId));AlipayOpenMiniVersionGrayOnlineResponse response = alipayClient.execute(request);checkRequestResult(response);}catch (Exception e){e.printStackTrace();}}/*** 商户小程序灰度结束 alipay.open.mini.version.gray.cancel*/public void grayCancel(String appId, String appVerion){try {AlipayClient alipayClient = getAlipayClient();AlipayOpenMiniVersionGrayCancelRequest request = new AlipayOpenMiniVersionGrayCancelRequest();request.setBizContent("{" +"\"app_version\":\""+appVerion+"\"," +"\"bundle_id\":\"com.alipay.alipaywallet\"" +"  }");request.putOtherTextParam("app_auth_token", getAppAuthToken(appId));AlipayOpenMiniVersionGrayCancelResponse response = alipayClient.execute(request);checkRequestResult(response);}catch (Exception e){e.printStackTrace();}}/*** 小程序上架 alipay.open.mini.version.offline*/public void offlineApp(String appId, String appVersion){try {AlipayClient alipayClient = getAlipayClient();AlipayOpenMiniVersionOnlineRequest request = new AlipayOpenMiniVersionOnlineRequest();request.setBizContent("{" +"\"app_version\":\""+appVersion+"\"," +"\"bundle_id\":\"com.alipay.alipaywallet\"" +"  }");request.putOtherTextParam("app_auth_token", getAppAuthToken(appId));AlipayOpenMiniVersionOnlineResponse response = alipayClient.execute(request);checkRequestResult(response);}catch (Exception e){e.printStackTrace();}}
}

4.4 BusinessMiniProgramOfflineFacade.java
package com.dfire.soa.wechat.facade.isv;import com.alipay.api.AlipayClient;
import com.alipay.api.request.AlipayOpenMiniVersionOfflineRequest;
import com.alipay.api.response.AlipayOpenMiniVersionOfflineResponse;
import org.springframework.stereotype.Service;/*** User: lanxinghua* Date: 2019/12/25 20:14* Desc: ISV小程序模板服务-商户小程序下架* 文档地址:https://opendocs.alipay.com/mini/isv/fir962*/
@Service
public class BusinessMiniProgramOfflineFacade extends IsvBaseFacade {/*** 商户小程序下架 alipay.open.mini.version.offline*/public void offlineApp(String appId, String appVersion){try {AlipayClient alipayClient = getAlipayClient();AlipayOpenMiniVersionOfflineRequest request = new AlipayOpenMiniVersionOfflineRequest();request.setBizContent("{" +"\"app_version\":\""+appVersion+"\"," +"\"bundle_id\":\"com.alipay.alipaywallet\"" +"  }");request.putOtherTextParam("app_auth_token", getAppAuthToken(appId));AlipayOpenMiniVersionOfflineResponse response = alipayClient.execute(request);checkRequestResult(response);}catch (Exception e){e.printStackTrace();}}
}

4.5 BusinessMiniProgramQrcodeFacade.java
package com.dfire.soa.wechat.facade.isv;import com.alipay.api.AlipayClient;
import com.alipay.api.request.AlipayOpenAppQrcodeCreateRequest;
import com.alipay.api.request.AlipayOpenMiniExperienceCancelRequest;
import com.alipay.api.request.AlipayOpenMiniExperienceCreateRequest;
import com.alipay.api.request.AlipayOpenMiniExperienceQueryRequest;
import com.alipay.api.response.AlipayOpenAppQrcodeCreateResponse;
import com.alipay.api.response.AlipayOpenMiniExperienceCancelResponse;
import com.alipay.api.response.AlipayOpenMiniExperienceCreateResponse;
import com.alipay.api.response.AlipayOpenMiniExperienceQueryResponse;
import org.springframework.stereotype.Service;/*** User: lanxinghua* Date: 2019/12/25 20:10* Desc:*/
@Service
public class BusinessMiniProgramQrcodeFacade extends IsvBaseFacade {/*** alipay.open.app.qrcode.create  商户小程序二维码生成* query_param:小程序的启动参数,onLaunch* url_param:page/component/test*/public void createQrcode(String appId, String urlParam, String queryParam, String desc){try {AlipayClient alipayClient = getAlipayClient();AlipayOpenAppQrcodeCreateRequest request = new AlipayOpenAppQrcodeCreateRequest();request.setBizContent("{" +"\"url_param\":\""+urlParam+"\"," +"\"query_param\":\""+queryParam+"\"," +"\"describe\":\""+desc+"\"" +"  }");request.putOtherTextParam("app_auth_token", getAppAuthToken(appId));AlipayOpenAppQrcodeCreateResponse response = alipayClient.execute(request);checkRequestResult(response);}catch (Exception e){e.printStackTrace();}}/*** alipay.open.mini.experience.create(小程序生成体验版)*/public void createExperience(String appId, String appVersion){try {AlipayClient alipayClient = getAlipayClient();AlipayOpenMiniExperienceCreateRequest request = new AlipayOpenMiniExperienceCreateRequest();request.setBizContent("{" +"\"app_version\":\""+appVersion+"\"," +"\"bundle_id\":\"com.alipay.alipaywallet\"" +"  }");request.putOtherTextParam("app_auth_token", getAppAuthToken(appId));AlipayOpenMiniExperienceCreateResponse response = alipayClient.execute(request);checkRequestResult(response);}catch (Exception e){e.printStackTrace();}}/*** alipay.open.mini.experience.query(小程序体验版状态查询接口)* expVersionPackged-体验版打包成功* expVersionPackaging-体验版打包中* notExpVersion-非体验版*/public void queryExperienceStatus(String appId, String appVersion){try {AlipayClient alipayClient = getAlipayClient();AlipayOpenMiniExperienceQueryRequest request = new AlipayOpenMiniExperienceQueryRequest();request.setBizContent("{" +"\"app_version\":\""+appVersion+"\"," +"\"bundle_id\":\"com.alipay.alipaywallet\"" +"  }");request.putOtherTextParam("app_auth_token", getAppAuthToken(appId));AlipayOpenMiniExperienceQueryResponse response = alipayClient.execute(request);checkRequestResult(response);}catch (Exception e){e.printStackTrace();}}/*** alipay.open.mini.experience.cancel(小程序取消体验版)*/public void cancelExperience(String appId, String appVersion){try {AlipayClient alipayClient = getAlipayClient();AlipayOpenMiniExperienceCancelRequest request = new AlipayOpenMiniExperienceCancelRequest();request.setBizContent("{" +"\"app_version\":\""+appVersion+"\"," +"\"bundle_id\":\"com.alipay.alipaywallet\"" +"  }");request.putOtherTextParam("app_auth_token", getAppAuthToken(appId));AlipayOpenMiniExperienceCancelResponse response = alipayClient.execute(request);checkRequestResult(response);}catch (Exception e){e.printStackTrace();}}
}

智慧商圈支付宝小程序(ISV系统服务商开发模式)相关推荐

  1. 微信小程序订餐系统需要服务器吗,微信小程序订餐系统怎么开发 怎么创建微信外卖小程序...

    原标题:微信小程序订餐系统怎么开发 怎么创建微信外卖小程序 过硬(10guoying.com)6月4日 观察:网上订餐的新消费方式如今在我们日常生活中已经十分常见,人们不仅可以在饿了么.美团等的外卖平 ...

  2. 校园音乐点歌平台的设计与开发 微信小程序 点歌系统 java 开发

    1. 微信小程序前台展示 2 . 使用到的技术框架 Springboot+maven+mybatis+网易云相关API 3.  后台展示 项目地址: 项目地址

  3. 如何取消小程序中的云开发模式

    在创建项目的时候,有时候手抖会点到云开发模式,发现即使将该项目删除重建,再次创建的项目也是默认使用云开发模式;这是后,我们就开始慌了经了解,有以下两种解决方式 第一种:回到该项目的根目录,将涉及云开发 ...

  4. 支付宝小程序云产品发布会:6大产品20项亮点全揭秘

    前言 7号,"支付宝开发者日暨支付宝小程序云产品发布会"在上海举办,这也是产品正式对外开放服务后,商家.服务商.开发者们与支付宝产品技术团队的正式见面. 文章目录 前言 一.什么是 ...

  5. 做不大的支付宝小程序,逃不脱的付钱关系

    文|曾响铃 来源|科技向令说(xiangling0815) 马云离职的热度还没下去,运营了一年的支付宝小程序在微信小程序的强势下迫不及待秀出了肌肉. 9月12日北京蚂蚁开放日活动上,支付宝小程序搞了个 ...

  6. 微信小程序和支付宝小程序对应的差异

    记录将微信小程序代码挪到支付宝小程序的过程中遇到的一些支付宝小程序和微信小程序的差异,以免每次都去官方文档查. 1.文件后缀名 微信小程序的四个文件后缀为.js..json..wxml..wxss,支 ...

  7. 建设小程序商城系统方式分享及优缺点分析

    小程序商城系统凭借着其线上化.智能化.数字化的优势.受到了很多传统企业的青昧,很多传统企业开始建设电商小程序来开展业务,那么企业建设小程序商城系统平台的方式有哪些的呢?接下来就跟着商人宝小编一起来看看 ...

  8. 【附源码】Java计算机毕业设计基于微信小程序停车系统(程序+LW+部署)

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  9. 微信小程序分销系统有哪些营销模式?看完你就秒懂了!

    随着微信小程序的发展,不少商家们都嗅到了商机,纷纷开发出各种各样的小程序系统,其中微信小程序分销系统是目前比较多的零售企业和微商卖家们所选用的微信营销工具.那么,微信小程序分销系统以有哪些模式呢?下面 ...

最新文章

  1. python3 from import 与 import 区别
  2. 魔兽服务器状态页面,谁动了我的服务器 WOW大服务器优势何时展现
  3. Django(part26)--修改及删除记录
  4. php yii框架源码,yii 源码解读
  5. 超声波机行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  6. 微信的cookie 和 session
  7. 【Linux】X window与文本模式的切换
  8. AutoCAD彻底卸载和清理注册表
  9. jeesit的使用(一)
  10. 数据库的ACID是什么
  11. php通过JODConverter将word转换为pdf
  12. Python自学指南-你好啊!Python
  13. 【不忘初心】Win10_20H2_2009_19042.572_X64_六合一_[纯净精简版](2020.10.29)
  14. Educoder Java高级特性 - JDBC(上)
  15. Dubbo-06 20190320
  16. 畅游CTO洪晓健:BW和CE3游戏引擎各取所长
  17. 【JS】数据结构之树结构
  18. truecrypt mac win10下无法使用的解决
  19. 用C语言实现推箱子小游戏基础程序plus
  20. Python中type的意思

热门文章

  1. 量子态层析(quantum state tomography)
  2. 自动化开发cmd封装:
  3. 多个线程ThreadLocal中存的是什么
  4. [TravelNotes] WC 2017 THUWC 2017 游记
  5. CC00009.python——|HadoopPython.v09|——|Arithmetic.v09|语法:核心语法运算符.V1|
  6. 史上最全《计算机网络 自顶向下方法》答案合集
  7. 单细胞分析:聚类流程(六)
  8. 如何安装打印机驱动程序
  9. 原来微信“对方正在输入”在这种情况下才显示
  10. Android使用搜狗输入法表情问题