首先需要导入商米支付paymentservice.jar包:下面介绍几个商米提供的工具类:
1.AppType

public class AppType {private static HashMap<String, String> typeMap;static {/***  应用类型*  00:银行卡应用*  01:聚合扫码支付应用*  02:银行卡+银联扫码支付应用*  03-50由协议保留, 51往后为自定义扩展预留*/typeMap = new HashMap<>();typeMap.put("00", "银行卡应用");typeMap.put("01", "聚合扫码支付应用");typeMap.put("02", "银行卡+银联扫码支付应用");typeMap.put("51", "人脸");}public static boolean checkType(String type) {return typeMap.containsKey(type);}
}

2.Config

/*** L3自定义配置类** @author:sunhengzhi* @date:2018-12-06*/
public class Config {/*** 交易过程中是否显示UI界面(不包括结果页)*/private Boolean processDisplay;/*** 是否展示交易结果页*/private Boolean resultDisplay;/*** 是否打印小票*/private Boolean printTicket;/*** 指定签购单上的订单号类型*/private String printIdType;/*** 备注*/private String remarks;public Boolean getProcessDisplay() {return processDisplay;}public void setProcessDisplay(Boolean processDisplay) {this.processDisplay = processDisplay;}public Boolean getResultDisplay() {return resultDisplay;}public void setResultDisplay(Boolean resultDisplay) {this.resultDisplay = resultDisplay;}public Boolean getPrintTicket() {return printTicket;}public void setPrintTicket(Boolean printTicket) {this.printTicket = printTicket;}public String getPrintIdType() {return printIdType;}public void setPrintIdType(String printIdType) {this.printIdType = printIdType;}public String getRemarks() {return remarks;}public void setRemarks(String remarks) {this.remarks = remarks;}@Overridepublic String toString() {return "Config{" +"processDisplay=" + processDisplay +", resultDisplay=" + resultDisplay +", printTicket=" + printTicket +", printIdType='" + printIdType + '\'' +", remarks='" + remarks + '\'' +'}';}
}

3.InstallApkUtils

public class InstallApkUtils {public static String smilePkgName = "com.alipay.zoloz.smile";public static String SunmiPayPkgName = "com.sunmi.payment";// 商米收银服务public static boolean checkApkExist(Context context, String packageName) {if (TextUtils.isEmpty(packageName)) return false;try {ApplicationInfo info = context.getPackageManager().getApplicationInfo(packageName, PackageManager.GET_UNINSTALLED_PACKAGES);return true;} catch (PackageManager.NameNotFoundException e) {return false;}}/*** get App versionCode * @param context * @return*/public static int getVersionCode(Context context, String packageName) {PackageManager packageManager = context.getPackageManager();PackageInfo packageInfo;int versionCode = 0;try {packageInfo = packageManager.getPackageInfo(packageName, 0);versionCode = packageInfo.versionCode;Log.e("@@@","versionCode=="+versionCode+" ");} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}return versionCode;}}

4.PaymentRequest

public class PaymentRequest {/*** 应用类型* 00:银行卡应用* 01:聚合扫码支付应用* 02:银行卡+银联扫码支付应用* 03-50由协议保留, 51往后为自定义扩展预留*/public String appType;/*** 交易类型* 00-消费* 01-撤消* 02-退货* 03-预授权* 04-预授权撤销* 05-预授权完成* 06-预授权完成撤销* 07-结算* 08-签到* A1-打印* A2-本地交易记录查询*/public String transType;/*** 应用包名*/public String appId;/*** 交易金额* 单位为分,1元表示为100L*/public long amount;/*** 支付码*/public String payCode;/*** MIS订单号* 任意字符串,用于标识当笔交易的流水号,交易处理结果中会带回。*/public String misId;/*** 商户订单号*/public String orderId;public String businessId;/*** 原MIS订单号*/public String oriMisId;/*** 原商户订单号*/public String oriOrderId;/*** 原交易日期* 格式“MMdd”, 部分业务退货使用*/public String oriTransDate;/*** 原系统参考号* 部分业务退货使用*/public String oriReferenceNum;/*** 原凭证号* 撤销、打印使用*/public String oriVoucherNum;/*** 原授权码* 预授权撤销使用*/public String oriAuthNum;/*** 是否打印小票* 为“1”时打印;为“0”时不打印。默认打印*/public String printTicket;public Config config;public boolean checkBaseArgument() {if (TextUtils.isEmpty(appId))return false;switch (TransType.getTransType(transType)) {case CONSUME:if (!AppType.checkType(appType)) {return false;}if (amount <= 0)return false;return true;case RETURN_MONEY:if (TextUtils.isEmpty(oriMisId) && TextUtils.isEmpty(oriOrderId))return false;if (amount <= 0)return false;return true;case QUERY:if (TextUtils.isEmpty(orderId) && TextUtils.isEmpty(misId)) {return false;}return true;}return false;}
}

5.PaymentResponse

public class PaymentResponse {/*** 协议版本号*/public String version;/*** 交易结果返回码* 00:成功* 非00:失败, 见返回码定义*/public String resultCode;/*** 错误描述*/public String resultMsg;/*** 应用类型*/public String appType;/*** 交易类型*/public String transType;/*** MIS订单号* 任意字符串,用于标识当笔交易的流水号,交易处理结果中会带回。*/public String misId;/*** 商户订单号*/public String orderId;/*** 交易金额* 单位为分,1元表示为100L*/public long amount;/*** 已退款金额* 单位为分,1元表示为100L*/public long refunded;/*** 实付金额* 单位为分,1元表示为100L*/public long amount1;/*** 优惠金额* 单位为分,1元表示为100L*/public long amount2;/*** 商家优惠金额* 单位为分,1元表示为100L*/public long amount3;/*** 交易日期* 格式“MMdd”*/public String transDate;/*** 交易时间* 格式“HHmmss”*/public String transTime;/*** 凭证号*/public String voucherNum;/*** 批次号*/public String batchNum;/*** 参考号*/public String referenceNum;/*** 授权号*/public String authNum;/*** 卡号*/public String cardNum;/*** 发卡行*/public String issuer;/*** 收单行*/public String acquirer;/*** 操作员号*/public String operatorId;/*** 卡类型*/public String cardType;/*** 账户类型*/public String accountType;/*** 机型*/public String model;/*** 终端号*/public String terminalId;/*** 商户号*/public String merchantId;/*** 第三方平台订单号(微信、支付宝的订单号)**/public String platformId;/*** 原MIS订单号*/public String oriMisId;/*** 原商户订单号*/public String oriOrderId;public String platform;public String payCode;
}

6.TransType

public enum TransType {//对外CONSUME("00"),//-消费PRE_AUTH("03"),//-预授权PRE_AUTH_COMPLETE("05"),//-预授权完成RETURN_MONEY("09"),//-退款PRINT("A1"),//-打印QUERY("A2"),//-本地交易记录查询//内部使用REVOKE("01"),//-撤消RETURN_GOODS("02"),//-退货PRE_AUTH_REVOKE("04"),//-预授权撤销PRE_AUTH_COMPLETE_REVOKE("06"),//-预授权完成撤销SETTLEMENT("07"),//-结算(换班)SIGN_IN("08");//-签到TransType(String code) {this.code = code;}private String code;public String Code() {return code;}public static TransType getTransType(String code) {if (TextUtils.isEmpty(code)) {throw new IllegalArgumentException();}switch (code) {case "00":return CONSUME;case "03":return PRE_AUTH;case "05":return PRE_AUTH_COMPLETE;case "09":return RETURN_MONEY;case "A1":return PRINT;case "A2":return QUERY;}throw new IllegalArgumentException();}}

上面这些类基本大家一看就能看明白,接下来在提供一个调用类,商米支付支持刷脸,扫码,刷卡等方式的支付。
SummiPayUtil

public class SummiPayUtil {private static final String TAG = "PayMentPayPresenter";Context context;/*** 初始化刷脸服务** @param context getApplicationContext()*/public SummiPayUtil(Context context) {this.context = context;}public boolean startFaceService(long orderId, String phoneNumber, String uuid) {startFaceService(orderId, phoneNumber, 1, uuid);return true;}public boolean isHaveSunmiPay() {return InstallApkUtils.checkApkExist(context, InstallApkUtils.SunmiPayPkgName);}/*** 开始刷脸** @return*/public boolean startFaceService(long orderId, String phoneNumber, long money, String uuid) {if (!isHaveSunmiPay()) {MyToast.showLong("未安装商米收银");return false;}if (TextUtils.isEmpty(phoneNumber)) {phoneNumber = "";}execute("51", orderId, phoneNumber, money, uuid);return true;}public boolean startPayCode(long orderId, String payCode, long money, String uuid) {execute("01", orderId, payCode, money, uuid);return true;}private void execute(String payMode, long orderId, String phoneNumber, long money, String uuid) {Logger.e("liluo", "调用支付"+money);Intent intent = new Intent();intent.setAction("sunmi.payment.action.entry");intent.setPackage("com.sunmi.payment");PaymentRequest request = new PaymentRequest();request.appType = payMode;request.appId = context.getPackageName();request.transType = TransType.CONSUME.Code();request.amount = money;/*money*///商米支付最低单位是分request.orderId = uuid;request.businessId = String.valueOf(orderId);request.printTicket = "0";request.payCode = phoneNumber;Config config = new Config();config.setResultDisplay(false);//默认开启收银台结果页,关闭之后将不会显示sunmi收银台的结果页config.setProcessDisplay(true);//默认开启收银台进度页,关闭后将先不会跳转至sunmi收银台,直接进行交易流程request.config = config;String jsonString = jsonString(request);PaymentService.getInstance().callPayment(jsonString);}public String jsonString(PaymentRequest request) {String string =new Gson().toJson(request);return string;}/*** 商米退款* @param payMode* @param orderId* @param* @param money* @param uuid*/public void returnExecute(String payMode, long orderId, long money, String uuid,String oriOrderId) {Logger.e("liluo", "调用商米退款"+money);Intent intent = new Intent();intent.setAction("sunmi.payment.action.entry");intent.setPackage("com.sunmi.payment");PaymentRequest request = new PaymentRequest();request.appType = payMode;request.appId = context.getPackageName();request.transType = TransType.RETURN_MONEY.Code();request.amount = money;/*money*///商米支付最低单位是分request.orderId = uuid;request.businessId = String.valueOf(orderId);request.printTicket = "0";request.oriOrderId = oriOrderId;Config config = new Config();config.setResultDisplay(false);//默认开启收银台结果页,关闭之后将不会显示sunmi收银台的结果页config.setProcessDisplay(false);//默认开启收银台进度页,关闭后将先不会跳转至sunmi收银台,直接进行交易流程request.config = config;String jsonString = jsonString(request);PaymentService.getInstance().callPayment(jsonString);}/*** 支付查询* @param* @param orderId*/public void selectExecute(String orderId) {Logger.e("liluo","查询订单号:"+orderId);Logger.e("liluo", "调用商米查询");Intent intent = new Intent();intent.setAction("sunmi.payment.action.entry");intent.setPackage("com.sunmi.payment");PaymentRequest request = new PaymentRequest();request.appId = context.getPackageName();request.transType = TransType.QUERY.Code();request.orderId = orderId;request.printTicket = "0";Config config = new Config();config.setResultDisplay(false);//默认开启收银台结果页,关闭之后将不会显示sunmi收银台的结果页config.setProcessDisplay(false);//默认开启收银台进度页,关闭后将先不会跳转至sunmi收银台,直接进行交易流程request.config = config;String jsonString = jsonString(request);PaymentService.getInstance().callPayment(jsonString);}
}

调用就非常简单了,就不举例子了,有问题欢迎私信。

商米设备开发之-支付相关推荐

  1. 商米设备开发之-打印(适配大部分商米设备)

    今天这里讲的是商米内置打印设备,不涉及商米云打印.,内置需要根据机型进行区分,大致分两种,这里给出区分不同商米不同机型的代码: 获取品牌代码:(商米的品牌为SUNMI) // public stati ...

  2. Android连扫码盒子,商米扫码盒正式上市,为解决扫码支付痛点而生

    原标题:商米扫码盒正式上市,为解决扫码支付痛点而生 近年来,随着移动支付的兴起,有越来越多的消费者使用微信.支付宝等方式进行付款,扫码支付备受青睐.为了迎合消费者扫码支付的需求,商家不得不使用扫码支付 ...

  3. 小米生态链企业商米科技完成数亿元C+轮融资,蚂蚁金服投资...

    1月25日消息,小米生态链企业商米科技完成数亿元人民币C+轮融资,投资方为蚂蚁金服. 商米科技是一家移动支付智能硬件研发商,商米科技已经拿到5轮融资,投资界制表如下: 商米的前身是小米投资的" ...

  4. 商米设备的集成(打印小票,刷卡功能)

    简言: 公司一直在做使用pos设备有关的项目,选用的是商米的商户,设备主要实现功能就是刷卡功能与打印小票功能,商家提供了一个简单的demo,刚开始就让人蒙圈, 查阅百度,各种博客,发现关于商米设备的很 ...

  5. 引入阿里云GA,商米加速IoT产品和解决方案全球化布局

    在全球化战略布局下,今年以来,商米联合全球合作伙伴推出了多款智能IoT 产品和数字化解决方案,为商户提供更专业地服务.同时,今年6月份,商米还引入阿里全球加速GA,加速实现信息化办公系统全球部署,全球 ...

  6. uniapp 获取商米本机SN码

    如果有对接商米机型的同学可以参考,在Android环境下获取商米机型的SN码,参考如下代码: 博主这边使用的是 M2_MAX, 1.首先在AndroidManifest.xml中添加如下权限: < ...

  7. 【Android】Android 集成商米内置打印机打印票据

    文章目录 [Android]Android 集成商米内置打印机打印票据 1.集成商米打印依赖 2.规范接口接口 3.使用到的相关对象以及工具类 4.MainActivity初始化接口 5.Uniapp ...

  8. 商米科技首次冲刺上市失败:科创属性遭质疑,连年亏损造血难?

    近日,上交所披露的信息显示,上海商米科技集团股份有限公司(以下简称"商米科技")在科创板IPO的审核状态已变更为"终止".这意味着,商米科技首次冲刺科创板上市宣 ...

  9. android 连接商米POSV1内置打印机

    最近接触连接打印机的比较多,就写下来吧 连接商米POSV1的打印机: 商米官网上有开发文档,具体可以看下,我只写下步骤: (1)因为我用的AIDL的方法,所以先把这3个文件放入到项目中 (2)创建线程 ...

最新文章

  1. 阿里云服务器ECS配置LNMP
  2. pyhton 去除字典空值
  3. u-boot分析之编译体验(零)
  4. 视网膜脱落相关知识(持续更新中)
  5. 【IBatisNet Spring.Net】ORM与IOC 简单配置
  6. 程序员python工作_程序员如何在工作中进步
  7. 彻底卸载acer软件保护卡_宏碁(Acer)传奇 14英寸 新一代7nm六核处理器 真香机 高性能宏基笔记本电脑(R5-4500U 7纳米 16G 512GSSD )...
  8. TreeView控件问题汇总
  9. unix网络编程之基本套接口编程
  10. 计算机中丢失了gdiplus.dll,解决 “计算机中丢失gdiplus.dll”
  11. obj文件格式详解及示例
  12. mzy git学习,分支冲突,以及冲突解决(五)
  13. Diligent收购领先的批判性见解和分析SaaS提供商Insightia
  14. Java 之 Serializable 序列化和反序列化的概念,作用的通俗易懂的解释【转】
  15. 国产 CAE 软件研发
  16. mysql数据自增ID为2的解决办法
  17. 【javascript】纯原生js的轻便组织结构图,树状图,支持自定义样式
  18. 几种典型静电场的场强、电势
  19. oracle冲账语句_ORA-00xx问题 -oracle卸载不成功
  20. 【我的Android进阶之旅】 Android Studio 使用小技巧:快速Close Others其他的文件

热门文章

  1. ​8400万!东阿阿胶电商销售战略再创佳绩
  2. 时间复杂度、空间复杂度的分析--王争数据结构与算法学习笔记
  3. java如何判断前端传来的是否是数字类型
  4. ds填空题2021/2/16
  5. 银行卡图片和银行名字怎么对应
  6. VIM选择文本块/复制/粘贴
  7. 【原创】我所认识的银行业务之旅(结售汇篇)
  8. 三相超快恢复二极管整流桥开关模块
  9. 基于Vue2实现的仿手机QQapp(支持对话功能,滑动删除....)—— 聊聊开发过程中踩到的一些坑与解决方案,以及个人感悟...
  10. 安装指定版本的docker服务