首先需要导入商米支付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. 一种新颖的流程控制方式
  2. 立创eda封装转cadence_立创EDA05、检查封装、生成PCB
  3. 北邮OJ 84. Single Number
  4. 揭秘MySQL生态重要功能,X-Engine引擎核心能力——OnlineDDL
  5. Nand Flash Yaffs系统大量写入数据失败问题的解决方法。
  6. 阿里巴巴发布招聘微博:新财年新增超过1800岗位需求
  7. Java中抽象类和接口的区别(来源二,原始来源不明确)
  8. java 控制路由器_停用角度路由器链路
  9. 第八章 程序的分支结构
  10. 将超星图书转成PDF文档
  11. vue第五天笔记02——vuex数据仓库
  12. 计算机读不了硬盘分区,修复移动硬盘分区故障和无法识别计算机
  13. C语言编程>第二十周 ③ 请补充fun函数,该函数的功能是:把字符串s中的字符按字符的ASCII码升序排列,处理后的字符串仍然保存在原串中,字符串及其长度作为函数参数传入。
  14. QGraphicsView 更改鼠标样式 以及QGraphicsItem悬停时更改鼠标样式
  15. 解决win10蓝牙搜索到小爱音箱无法连接问题
  16. c语言上11e2是实型常量吗,在C语言中的实型变量分为两种类型.doc
  17. 小姐姐教你用代码画画,真大佬!
  18. mysql 所有字符集_mysql字符集
  19. Deep Lab 系列总结
  20. C语言#include的用法

热门文章

  1. 2022DASCTF Apr X FATE 防疫挑战赛WP
  2. PS快捷键和常用小知识
  3. mysql批量修改表名或前缀
  4. 清华EMBA课程系列思考之十一 -- 金融市场与投资分析
  5. 南京银行信息技术岗提前批笔试与面试
  6. canvas创建画板
  7. 尚观课程-1.Shell基础
  8. 教你如何简单去除csdn等网页广告
  9. 日本3D打印现状及发展情况
  10. 全国影子银行数据(含信托、理财、理财产品余额等数据)