小米手机配置 华为手机配置 部分手机没有制作教程,请参考小米手机配置。
注意:修改手机这些设置的目的是为了在微信和支付宝收到款以后,在手机通知栏出现通知消息同时不让手机进入休眠和结束 XueliPay App、微信、支付宝进程,这样才能保证正常收款。
注意:银行卡转账收款方式判断是否资金到账,是监听银行卡预留手机号的银行卡入账短信通知,所以也需要短信读取功能,安装XueliPay APP之后,请允许短信读取权限。
注意:用于安装 XueliPay App 的这个手机最好放在家里专用,并且一直连上充电线。
「XueliPay 个人收款」 的原理是通过安装到手机的App监控手机微信、支付宝的二维码扫码支付到账通知并回调开发者应用。 消费者在支付的时候是扫描开发者的个人微信、支付宝收款二维码。 如果是银行卡转账模式,则是监听银行卡预留手机号收到的银行卡入账短信。
注意:XueliPay 支持企业支付宝。
注意:在 支付宝 - 我的 - 商家服务 - 商家工具 - 收钱码 可以申请提现免费、永不过期、稳定跳转 的支付宝收款二维码。
注意:银行卡转账模式,可提示客户通过云闪付或微信转账到账时间最快,绝大部分10秒以内。其次到支付宝,绝大部分3分钟内。其他的金融App未测试。
注意:当你发起支付请求的时候,系统会自动匹配和支付价格最接近的固定金额支付二维码,如果没有找到可用的(比如已经被使用或者不存在这个价格的支付二维码)系统会使用不固定金额支付二维码(支付页面会提示消费者手动输入支付金额)。
举例:比如你的商品价格是¥35,那么你可以上传你自己的微信、支付宝固定金额支付二维码¥34.97、¥34.98、¥34.99、¥35、¥35.01、¥35.02、¥35.03。当你发起金额为¥35支付请求的时候,会把 ¥35±0.1 的支付二维码都作为候选,选择一个最接近并且当前没有被使用的支付二维码返回给消费者支付。
接口地址:https://xuelipay.com/api/order/create 调用方法:POST (注意 content-type 设置为 application/x-www-form-urlencoded 哦) 调用参数: - appId, 必填, 在后台应用配置页面查看 - orderType, 必填, 支付方式【可选0(微信) ,1(支付宝),4(银行卡转账)】 - orderPrice, 必填, 订单价格(单位:元) - userOrderId, 必填, 商户订单号 - userNameId, 必填, 订单购买用户对应的唯一id(便于后续商户自己对账) - callbackUrl, 必填, 支付成功后回调地址,可以是单个ip或者多个ip格式。 单个ip格式为'http:xxx',多个ip格式为['http:xxx1','http:xxx2',...],数组最多包含6个ip。 数组ip格式按ip顺序回调,只要有一个通知成功,后续ip不再通知。国内服务器单一ip即可。但是对香港,美国等地区网络波动非常有效果。 - sign, 必填, 数据签名 详见签名算法 注意:XueliPay需要你自定义支付页面,需要你自己展示付款二维码。我们提供了一些精美的付款界面Demo供你参考; 注意:Xuelipay 微信,支付宝默认订单过期秒数是300秒,银行卡转账默认过期秒数是1200秒。 注意:如果同一个用户(userNameId)存在相同金额(orderPrice)、相同支付渠道(orderType)且未过期的订单,
建议在服务端做好缓存策略(这样不会产生很多订单、可以提高成功率、用户多次点击付款订单金额不会变化) json 格式接口返回: { "code":200, "data":{ "payId":"b5b4d9cb2cd78346c37f0d1690798b4a", "orderType":0, "orderPrice":35, "realPrice":35, "qrCodeUrl":"wxp://f2f0-vFHHDCw3L4zegbJzXyQ0nO06w5BK2e1" or {"bankName":"银行名称","accountName":"银行卡户主姓名","bankAccount":"银行卡账户"}, "jumpUrl":"", "userOrderId":"7e48aea9e79edfd7d067961f16dd49f2", "userNameId":"3ae57c656e432655f4437a3c7ebf3317" } } - code, 付款请求结果,200=成功,500=失败 - data, 请求成功的内容对象,或者错误描述。 - payId, xuelipay平台订单唯一标示可用于查询订单状态 - orderType, 支付方式【可选0(微信) ,1(支付宝)】 - orderPrice, 订单价格 - realPrice, 实际用户这次应当支付二维码的金额,相比订单价格有可能会上下浮动几分钱如果没有当前对应金额的二维码,会返回不固定金额二维码,具体金额需要用户输入,需要显示让用户输入 realPrice 的数值 - qrCodeUrl, 支付二维码内容 或者 json格式的银行卡的收款卡信息 - jumpUrl, 支付宝的转账模式支付链接 - userOrderId, 订单号(商户唯一订单号) - userNameId, 订单购买用户对应的唯一id(便于后续商户自己对账) 错误代码: - {"code": 500,"data":"会员已过期"}, 账户已过期,请先续期会员 - {"code": 500,"data":"余额不足"}, 账户余额小于0,请先充值 - {"code": 500,"data":"orderType值不在范围内"}, 付款方式错误 - {"code": 500,"data":"订单正在使用的金额过多,暂时没有可用金额,请稍后再试!"}, 无可用二维码,因为短时间单个用户订单太多,达到收款额度±0.2的上下限额。 如是单个用户恶意点击付款订单,建议在服务器端做好订单缓存功能。如业务订单确实很多,请注册多几个账户轮流使用即可满足高并发需求。 - {"code": 500,"data":"没有当前收款方式非固定金额的二维码"}, 无可用二维码,请上传当前付款方式的不固定金额二维码 - {"code": 500,"data":"暂不支持该收款方式"}, 暂时只支持微信、支付宝、银行账户转账方式。 - {"code": 500,"data":"银行收款账户未配置"}, 银行收款账户未配置,请到配置界面设置银行收款卡配置 - {"code": 500,"data":"银行收款账户已禁用"}, 银行收款卡配置,请请到配置界面点击启用银行收款卡。 - {"code": 500,"data":"产品许可已过期,请联系客服"}, 仅限深度合作或独立部署版本才有 - {"code": 500,"data":"余额不足扣除手续费,手续费需要:xx元"}, 仅限深度合作或独立部署版本才有
接口地址:你传入的 callbackUrl 参数 调用方法:GET 调用参数: - payId, xuelipay平台订单唯一标示可用于查询订单状态 - orderType, 支付方式【可选0(微信) ,1(支付宝)】 - orderPrice, 订单价格 - realPrice, 实际支付的金额 - userOrderId, 订单号(商户唯一订单号) - userNameId, 订单购买用户对应的唯一id(便于后续商户自己对账) - sign, 必填, 数据签名 详见签名算法 当你收到 XueliPay 的回调请求后,如果响应 HTTP code 200 那么 XueliPay 会认为通知成功, 否则会再次通知 6 次,间隔为 1/2/4/16/64/300 分钟。
接口地址:https://xuelipay.com/api/order/queryByPayId?payId=payId 调用方法:GET 注意:api 里面的 payId 为发起付款接口返回的 payId 接口返回: - {"code": 500,"data":"订单不存在"}, 订单不存在 - {"code": 200,"data":{"payStatus":0}}, 未支付 - {"code": 200,"data":{"payStatus":1}}, 已过期 - {"code": 200,"data":{"payStatus":2}}, 已收款已回调 - {"code": 200,"data":{"payStatus":3}}, 已收款回调中 - {"code": 200,"data":{"payStatus":4}}, 已收款回调失败,继续尝试中 - {"code": 200,"data":{"payStatus":5}}, 已收款回调失败
签名生成的通用步骤如下: 第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。 第二步,在stringA最后拼接上 &key=密钥 得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,得到sign值 签名例子(Java) public static String getSign(Mapmap, String appKey){ Collection keyset= map.keySet(); List keyList= new ArrayList<>(keyset); Collections.sort(keyList); StringBuilder sb = new StringBuilder(); for (String key : keyList){ sb.append(key).append("=").append(map.get(key)).append("&"); } sb.append("key=").append(appKey); return DigestUtils.md5DigestAsHex(sb.toString().getBytes()); }
package javaTest; import java.io.IOException; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.util.DigestUtils; import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.databind.annotation.JsonSerialize; public class XuelipayTest { /** * 支付来源 */ final static int zhifubaoTypePaySourceType = 1; final static int weixingTypePaySourceType = 2; /** * 轮流支付账户选择管理 */ static PayManager gPayManager = new PayManager(); /** * @deviceId 充值用户身份的唯一id * @amount 充值金额 单位元 * @param type * 充值收款方式,支付宝或者微信 */ public MappayThird(String deviceId, Float amount, Integer type) throws Exception { Map result = new HashMap (); String userOrderId = DigestUtils.md5DigestAsHex((deviceId + new Date().getTime()).toString().getBytes()); String userNameId = deviceId; String price = amount + ""; /** 支付方式 */ String orderType = ""; switch (type) { case zhifubaoTypePaySourceType: orderType = "1"; break; case weixingTypePaySourceType: orderType = "0"; break; } String payUrl = "https://xuelipay.com/api/order/create"; String orderPrice = String.valueOf(amount); String notify_url = "https://xuelipay.com/api/order/paySuccessNotify"; // 随机选一个收款账户 PayManager.XueliPayPo payPo = gPayManager.getOneByType(type); String appId = payPo.getAppId(); String appKey = payPo.getAppKey(); Map map = new HashMap<>(); map.put("orderType", orderType); map.put("orderPrice", orderPrice); map.put("userOrderId", userOrderId); map.put("userNameId", userNameId); map.put("appId", appId); map.put("callbackUrl", notify_url); String sign = getSign(map, appKey); map.put("sign", sign); JSONObject respJson = httpPost(payUrl, map, "utf-8"); if (200 != respJson.getInteger("code")) throw new IllegalArgumentException("支付参数错误!"); JSONObject dataRespJson = respJson.getJSONObject("data"); String qrCodeUrl = dataRespJson.getString("qrCodeUrl"); String payId = dataRespJson.getString("payId"); String realPrice = String.valueOf(dataRespJson.getBigDecimal("realPrice")); OrderPO orderPO = new OrderPO(); orderPO.setXueliPayId(payId); orderPO.setOrderId(userOrderId); orderPO.setPrice(amount); orderPO.setRealprice(amount); orderPO.setUserId(userPo.getId()); orderPO.setCreateTime(new Date()); orderPO.setStatus(0); orderPO.setDescription("充值" + amount); iOrderDao.save(orderPO); /** 返回必要数据给前端,用户收款码给用户付款 */ // 支付订单号 result.put("payId", payId); // 收款二维码 result.put("qrCodeUrl", qrCodeUrl); // 参考支付价格 result.put("orderPrice", orderPrice); // 实际支付价格 result.put("realPrice", realPrice); return result; } /** * http post request * * @param url * 请求url路径 * @param map * 参数集合 * @param charset * 请求编码 * @return 请求内容 */ public JSONObject httpPost(String url, Map map, String charset) { HttpClient httpClient = null; HttpPost httpPost = null; String result = null; try { httpClient = new DefaultHttpClient(); httpPost = new HttpPost(url); // 设置参数 List list = new ArrayList (); Iterator > iterator = map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry elem = iterator.next(); list.add(new BasicNameValuePair(elem.getKey(), elem.getValue().toString())); } if (list.size() > 0) { UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, charset); httpPost.setEntity(entity); } HttpResponse response = httpClient.execute(httpPost); if (response != null) { HttpEntity resEntity = response.getEntity(); if (resEntity != null) { result = EntityUtils.toString(resEntity, charset); } } } catch (Exception ex) { ex.printStackTrace(); } return (JSONObject) JSONObject.parse(result); } /** * xuelipay的签名 */ public static String getSign(Map map, String privateKey) { Collection keyset = map.keySet(); List keyList = new ArrayList<>(keyset); Collections.sort(keyList); StringBuilder sb = new StringBuilder(); for (String key : keyList) { sb.append(key).append("=").append(String.valueOf(map.get(key))).append("&"); } sb.append("key=").append(privateKey); return DigestUtils.md5DigestAsHex(sb.toString().getBytes()); } /** * 收到款的回调通知 */ public boolean paySuccessNotify(Integer orderType, BigDecimal orderPrice, BigDecimal realPrice, String userOrderId, String userNameId, String payId, String sign) { // Demo skip check sign valid System.out.println("回调 ****paySuccessNotify"); try { OrderPO orderPO = iOrderDao.findByOrderId(userOrderId); if (orderPO != null) { orderPO.setPayTime(new Date()); orderPO.setPayStaus("success"); iOrderDao.update(orderPO); } } catch (Exception e) { System.out.println(e); return false; } return true; } /** * 多个收款账户管理,提高收款金额和并发量。 */ static class PayManager { private int payCount = 0; /** * 获取一个支付的来源账户 * * @param paySourceType */ public XueliPayPo getOneByType(int paySourceType) { // 假随机,轮流来 payCount++; if (paySourceType == zhifubaoTypePaySourceType) { int chooseIndex = payCount % zhifubaoPayAccouts.size(); return zhifubaoPayAccouts.get(chooseIndex); } else { int chooseIndex = payCount % weixingPayAccouts.size(); return weixingPayAccouts.get(chooseIndex); } } /** 微信的收款账户集合 */ private List weixingPayAccouts; /** 支付宝的收款账户集合 */ private List zhifubaoPayAccouts; public PayManager() { initPayAccounts(); } /** * 初始化收款账户信息 */ private void initPayAccounts() { // 支持微信+支付宝 String appId_email1 = "xxxx"; String appKey_email1 = "xxxxxxxxxxxxxxxxxxxx"; String appId_email2 = "xxxx"; String appKey_email2 = "xxxxxxxxxxxxxxxxxxxx"; String appId_email3 = "xxxx"; String appKey_email3 = "xxxxxxxxxxxxxxxxxxxx"; weixingPayAccouts = new ArrayList () { { add(new XueliPayPo(weixingTypePaySourceType, appId_email1, appKey_email1)); add(new XueliPayPo(weixingTypePaySourceType, appId_email2, appKey_email2)); add(new XueliPayPo(weixingTypePaySourceType, appId_email3, appKey_email3)); } }; zhifubaoPayAccouts = new ArrayList () { { add(new XueliPayPo(zhifubaoTypePaySourceType, appId_email1, appKey_email1)); add(new XueliPayPo(zhifubaoTypePaySourceType, appId_email2, appKey_email2)); add(new XueliPayPo(zhifubaoTypePaySourceType, appId_email3, appKey_email3)); } }; } /** * xueli的支付账户信息 */ static class XueliPayPo { // 支付类型,支付宝还是微信 int paySourceType; String appId; String appKey; public XueliPayPo(int paySourceType, String appId, String appKey) { super(); this.paySourceType = paySourceType; this.appId = appId; this.appKey = appKey; } public String getAppId() { return appId; } public void setAppId(String appId) { this.appId = appId; } public String getAppKey() { return appKey; } public void setAppKey(String appKey) { this.appKey = appKey; } } } }
如何启用该模式? 在后台应用配置 - 多手机配置 - 设置 alipay userid
支付宝扫描以下二维码查看 userid
可以的,支付宝官方支持通过收款二维码直接唤起app支付。
不行,不过微信支付在微信浏览器里面可以长按二维码识别。
肯定的,用户支付的钱款不经过 XueliPay 而是直接到你的微信和支付宝钱包,即时到账,绝对安全。
XueliPay 用了严密的支付检测技术和二维码调度算法且服务器在国内,稳定运行已久,无一漏单。
不用。
「XueliPay 个人收款」的原理就是监控微信、支付宝的二维码到账通知,通过在 Android 手机上面安装「XueliPay 个人收款」App 可以监听到账通知,从而实现支付成功回调。如果手机没电或者没网络,那么手机就无法收到支付到账通知,用户扫码支付成功后就没办法回调你的服务接口了。
因为存在网络供应商,光猫,路由器等不稳定因素,WIFI是无法保证时时刻刻百分百稳定的。建议客户专门购买一张移动手机卡,千万不要日租流量卡,否则凌晨过后有断网的可能性,流量要按月算的套餐那种。使用4G上网的稳定性是几乎是100%,G上网会比WIFI稳定得多。
没有风险,这个支付过程和平常扫码支付一样,合理合规合法。
通过监控账户连续收款失败,超时没有成功订单,收到未匹配订单的金额,app超时掉线等情况。毫秒级的感知账户健康状态。实时通知商户,便于商户针对异常情况进行及时的处理。
1. 快速发现自己的收款账户是否已经被微信,支付宝风控限制。2. 挂机app是否由于网络原因掉线 3. 收到未匹配订单金额后最佳处理方法
由于支付宝最近限制了每张固定金额二维码每天最多只能收十次。建议使用非固定金额的二维码,提示用户手工输入金额即可。
支付宝针对固定金额和转账两种收款模式,随机随时会被风控,导致能听到播报,挂机App却无法监听到收款信息,导致出现已收款却无回调的情况发生。最快的解决办法就是启用支付宝的增强语音播报,杀掉支付宝进程重新打开即可。最佳的解决办法就是只使用非固定金额的收款码,付款页面提示客户手动输入金额即可。非固定收款二维码漏监听收款和被风控的概率几乎为零。
有的,我们自己正在用和推荐是红米Redmi 7,其他型号也可以。不过运行内存(RAM)最好3g以上,这样手机才不会出现内存不足,导致支付宝,微信,xuelipay app被系统杀死。
每一个xuelipay的账户收款都是完全独立的。如果同一时间段有高并发需求,注册多个xuelipay账户,然后使用多台手机登陆各个账户对应的微信支付宝,然后收款接口随机分配xuelipay账户即可。
xuelipay账户在每个浏览器登录之后,在没有人为清除浏览器数据之前,都默认保留登陆状态。所以你可以每个账户都使用一个浏览器来管理你的xuelipay账户
我们推荐的浏览器有 谷歌 火狐 IE Opera UC QQ浏览器 Vivaldi 遨游 百度浏览器 世界之窗 ChromeCore 猎豹浏览器 搜狗浏览器 夸克 Alook 无相 Safari 急速浏览器等
每月的套餐费用需要提前升级或者续费,每笔的手续费需要预先充值到你的 XueliPay 账户。
不会,只有 XueliPay App 检测到支付成功了,才会扣手续费。
有多种可能。用户支付后到你的应用收到回调通知,大概有几秒的延迟,如果 XueliPay 调用你的回调通知接口失败,XueliPay 会连续通知三次,每次间隔一分钟。还有可能是订单已经过期后用户才付款,这也会导致不会收到回调通知。
你可以在后台的订单管理页面,找到这个用户对应的订单,然后点击「已经收款」按钮,xuelipay.com 会调用你的回调接口通知这个订单已经收款。
支持的,XueliPay 支持支付宝普通收款码和官方收钱码。
支持。
支持。
支持。
可能是 jdk 对 let's encrypt ssl 证书的支持问题,把 API 的 https 换成 http 即可
应该是没有开启 “微信收款语音播报” 在微信「我」-「钱包」-「收付款」- 「二维码收款」- 点击右上角三个点 开启收款到账语音提醒。
没有。
没有数量限制。每天最多上传5w张,超过5w张可以发给客服批量导入。
XueliPay 非常注重商户隐私,我们无权私自查看商户的任何账户及订单信息。
注意:必须开启 XueliPay APP 的通知读取权限,否则无法读取支付通知。
安装 XueliPay APP 后会自动跳转到通知设置页面,请找到「XueliPay 收款」,并勾选。
以后要开启,请在系统「设置」-「更多设置」-「系统安全」-「通知读取权限」勾选。
在系统「设置」-「锁屏和密码」-「自动锁屏」- 选择「屏幕永不休眠」。
在系统「设置」-「电量和性能」-「省电优化」- 「省电模式」- 「关闭省电模式」。
在系统「设置」-「电量和性能」-「应用配置」- 「XueliPay|支付宝|微信」。
.在系统「设置」-「授权管理」-「自启动管理」- 勾选 XueliPay收款、微信、支付宝 允许自启动。
打开三个应用,然后按 设置键 呼出任务管理,向下拉动应用,锁定应用。
在系统「设置」-「通知和状态栏」-「通知管理」- 找到 XueliPay收款、微信、支付宝 开启所有通知。
在微信「设置」-「勿扰模式」- 关闭 勿扰模式。
注意:如果你在电脑上也登陆了这个收款微信号,请记得把手机静音取消,不然就收不到付款通知哦。
在微信「我」-「钱包」-「收付款」- 「二维码收款」- 点击右上角三个点 开启收款到账语音提醒。
在支付宝主页选择「我的」- [设置] - [通用] - [新消息通知] - [收钱到账语音提醒] - 开启 接收支付消息增强版提醒。
微信不能切换到首页,否则收不到收款通知(聊天列表页);如果手机支持分屏,建议把微信、支付宝显示到两个分屏,有助于即时收到微信支付宝到账推送,进程不被手机异常退出。
注意:必须开启 XueliPay APP 的通知读取权限,否则无法读取支付通知。
安装 XueliPay APP 后会自动跳转到通知设置页面,请找到「XueliPay 收款」,并勾选。
以后要开启,请在系统「设置」-「更多设置」-「系统安全」-「通知读取权限」勾选。
在系统「设置」-「显示」-「休眠」-「自动锁屏」- 选择「屏幕永不休眠」。
在系统「设置」-「电池」-「省电模式」- 「关闭省电模式」。
在系统「设置」-「电池」-「启动管理」- 「XueliPay|支付宝|微信」。
.打开三个应用,然后按 设置键 呼出任务管理,点击锁定应用。
在系统「设置」-「应用和通知」-「权限管理」- 找到 XueliPay收款、微信、支付宝 开启所有通知。
在微信「设置」-「勿扰模式」- 关闭 勿扰模式。
注意:如果你在电脑上也登陆了这个收款微信号,请记得把手机静音取消,不然就收不到付款通知哦。
在微信「我」-「钱包」-「收付款」- 「二维码收款」- 点击右上角三个点 开启收款到账语音提醒。
在支付宝主页选择「我的」- [设置] - [通用] - [新消息通知] - [收钱到账语音提醒] - 开启 接收支付消息增强版提醒。
微信不能切换到首页,否则收不到收款通知(聊天列表页);如果手机支持分屏,建议把微信、支付宝显示到两个分屏,有助于即时收到微信支付宝到账推送,进程不被手机异常退出。