本文主要是介绍Android 微信支付_扫码支付,我来帮你填坑!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
0.概述:
本文讲的是微信支付中的扫码支付的模式二:该模式下,二维码链接由微信支付返回给商户,商户将得到的二维码链接转成二维码图片,用户通过扫码支付,此方式下生成的二维码2小时内有效。
微信支付官网地址:https://pay.weixin.qq.com/wiki/doc/api/index.html
1.扫码支付步骤:
- 调用统一下单接口可获取到一个二维码链接参数code_url
- 调用第三方库将此链接code_url 转成二维码图片,code_url链接内容为:weixin://wxpay/bizpayurl?sr=xxxx
- 用户打开微信支付扫一扫完成支付
- 定时调用查询订单接口确认是否支付是否完成
- 退款接口
2.支付相关参数:
- appid 公众号ID (微信公众平台–>开发者中心查看,商户的微信支付审核通过邮件中也会包含该字段值)
- mch_id 商户ID 微信商户平台(帐户中心-商户信息-微信支付商户号)
- out_trade_no 商户订单号(可以使用当前时间毫秒数)
- key 商户支付密钥key(需要自己设置,为32位的密钥)
3.支付相关接口地址:
- 统一支付:https://api.mch.weixin.qq.com/pay/unifiedorder
- 查询订单:https://api.mch.weixin.qq.com/pay/orderquery
- 申请退款:https://api.mch.weixin.qq.com/secapi/pay/refund
4.android stdio使用相关包:
网络相关
compile files('libs/org.apache.httpcomponents.httpclient_4.5.3.jar')
二维码相关:
compile 'com.google.zxing:core:3.2.1'compile 'cn.bingoogolapple:bga-qrcodecore:1.1.7@aar'compile 'cn.bingoogolapple:bga-zxing:1.1.7@aar'
5.填坑记录:
- 不管是调用统一下单接口还是查询订单接口,还是退款接口,签名都是很重要的。记住,签名是大写。可以利用以下两个网站验证签名是否正确。
微信公众平台支付接口调试工具 https://pay.weixin.qq.com/wiki/tools/signverify/
微信支付接口签名校验工具 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=20_1 - 商户支付密钥key是自己设置的,一定和设置的一模一样,不要有大小写的转换。
退款接口需要用到双向证书https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=4_3。因此在代码上需要有体现。在android中只用到4个中的apiclient_cert.p12,官网中说,【证书文件不能放在web服务器虚拟目录,应放在有访问权限控制的目录中,防止被他人下载。商户服务器要做好病毒和木马防护工作,不被非法侵入者窃取证书文件。】本文中,为了方便,我暂时将其放在assert文件夹中存放,代码中也有体现
String result = null; // 证书密码(默认为商户ID) String password = Constent.VALUE_MCH_ID; // 实例化密钥库 KeyStore ks = KeyStore.getInstance("PKCS12"); // 获得密钥库文件流 AssetManager am = context.getResources().getAssets(); InputStream fis = am.open("apiclient_cert.p12"); // 加载密钥库 ks.load(fis, password.toCharArray()); // 关闭密钥库文件流 fis.close(); // 实例化密钥库 KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); // 初始化密钥工厂 kmf.init(ks, password.toCharArray()); // 创建SSLContext SSLContext sslContext = SSLContexts.custom().loadKeyMaterial(ks, Constent.VALUE_MCH_ID.toCharArray()) //加载证书密码,默认为商户ID.build(); sslContext.init(kmf.getKeyManagers(), null, new SecureRandom()); // 获取SSLSocketFactory对象 SSLSocketFactory ssf = sslContext.getSocketFactory();
4.还有很多坑,待补充….
6.1.终端调用统一下单接口,得到code_url
//1 统一下单
public String unifiedOrder() {SortedMap<String, Object> parameterMap = new TreeMap<String, Object>();parameterMap.put(Constent.APPID, Constent.VALUE_APPID);//公众号IDparameterMap.put(Constent.MCH_ID, Constent.VALUE_MCH_ID);//商户号parameterMap.put(Constent.DEVICE_INFO, "");//设备号parameterMap.put(Constent.NONCE_STR, PayCommonUtil.getRandomString(32));//随机字符串parameterMap.put(Constent.BODY, "");//商品描述parameterMap.put(Constent.SIGN_TYPE, Constent.MD);//签名类型parameterMap.put(Constent.DETAIL, "");//商品详情parameterMap.put(Constent.ATTACH, "");//附加数据time = System.currentTimeMillis() + "";parameterMap.put(Constent.OUT_TRADE_NO, time);//商户订单号parameterMap.put(Constent.FEE_TYPE, Constent.CNY);//标价币种parameterMap.put(Constent.TOTAL_FEE, "");//标价金额parameterMap.put(Constent.SPBILL_CREATE_IP, "");//终端IPparameterMap.put(Constent.TIME_START, System.currentTimeMillis() + "");//交易起始时间//异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的,不能携带参数。parameterMap.put(Constent.NOTIFY_URL, "");//通知地址(支付结果通知)parameterMap.put(Constent.TRADE_TYPE, Constent.NATIVE);//交易类型parameterMap.put(Constent.PRODUCT_ID, "");//商品ID(和设备ID一起需知,扫码支付时必须传)parameterMap.put(Constent.LIMIT_PAY, Constent.NO_CREDIT);//指定支付方式parameterMap.put(Constent.SIGN
这篇关于Android 微信支付_扫码支付,我来帮你填坑!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!