安卓微信支付

    xiaoxiao2022-06-28  59

    1.统一下单 /** * 构造支付统一下单参数列表 * @param app_id * @return */ public static Map<String, String> buildOrderParamMap(String mch_id,String subject, String price, String app_id) { //判断是否有网络连接 String ip =""; if(NetWorkUtil.isNetworkConnected(MyApplication.getInstance())){ NetWorkUtil.NetType apnNet = NetWorkUtil.getAPNType(MyApplication.getInstance()); if(apnNet == NetWorkUtil.NetType.WIFI){ ip = NetWorkUtil.getIpAddress(); } else { ip = NetWorkUtil.getLocalIpAddress(); } } else { ToastUtil.showMessage(MyApplication.getInstance(),"当前无网络"); return null; } Map<String, String> keyValues = new HashMap<String, String>(); //appid keyValues.put("appid", app_id); //商户号 keyValues.put("mch_id",mch_id); //随机字符串 keyValues.put("nonce_str", RandomUtil.generateString(32)); //商品描述 keyValues.put("body",subject); //商户订单号 keyValues.put("out_trade_no",getOutTradeNo()); //总金额 keyValues.put("total_fee",price); //通知地址 keyValues.put("notify_url",PAYONOTIFY); //交易类型 keyValues.put("trade_type","APP"); //终端ip keyValues.put("spbill_create_ip",ip); return keyValues; } /** * 对支付参数信息进行签名 * * @param map * 待签名授权信息 * * @return */ public static String getSign(Map<String, String> map, String rsaKey) { List<String> keys = new ArrayList<String>(map.keySet()); // key排序 Collections.sort(keys); StringBuilder authInfo = new StringBuilder(); for (int i = 0; i < keys.size() - 1; i++) { String key = keys.get(i); String value = map.get(key); authInfo.append(buildKeyValue(key, value, false)); authInfo.append("&"); } String tailKey = keys.get(keys.size() - 1); String tailValue = map.get(tailKey); authInfo.append(buildKeyValue(tailKey, tailValue, false)); String oriSign = authInfo.toString() + "&key=" + rsaKey; Log.i("weixin_param",oriSign); oriSign = Encrypt.MD5(oriSign.getBytes()).toUpperCase(); Log.i("weixin_sign",oriSign); String encodedSign = ""; try { encodedSign = URLEncoder.encode(oriSign, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return encodedSign; } /** * 构造支付统一下单参数列表 * @param app_id * @return */ public static Map<String, String> buildOrderParamMap(String mch_id,String subject, String price, String app_id) { //判断是否有网络连接 String ip =""; if(NetWorkUtil.isNetworkConnected(MyApplication.getInstance())){ NetWorkUtil.NetType apnNet = NetWorkUtil.getAPNType(MyApplication.getInstance()); if(apnNet == NetWorkUtil.NetType.WIFI){ ip = NetWorkUtil.getIpAddress(); } else { ip = NetWorkUtil.getLocalIpAddress(); } } else { ToastUtil.showMessage(MyApplication.getInstance(),"当前无网络"); return null; } Map<String, String> keyValues = new HashMap<String, String>(); //appid keyValues.put("appid", app_id); //商户号 keyValues.put("mch_id",mch_id); //随机字符串 keyValues.put("nonce_str", RandomUtil.generateString(32)); //商品描述 keyValues.put("body",subject); //商户订单号 keyValues.put("out_trade_no",getOutTradeNo()); //总金额 keyValues.put("total_fee",price); //通知地址 keyValues.put("notify_url",PAYONOTIFY); //交易类型 keyValues.put("trade_type","APP"); //终端ip keyValues.put("spbill_create_ip",ip); return keyValues; } /** * 要求外部订单号必须唯一。 * @return */ private static String getOutTradeNo() { SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss", Locale.getDefault()); Date date = new Date(); String key = format.format(date); Random r = new Random(); key = key + r.nextInt(); key = key.substring(0, 15); return key; } public interface WeiXinOrderService { @POST("pay/unifiedorder") Observable<String> getOrder(@Body String body); } 首先拼接参数签名,再将参数和签名sign按照微信支付要求的xml以body的形式传递给统一下单url,成功之后,微信支付会返回xml数据,个人用的是retrofit+rxandroid网络事件框架,所以在onNext中得到这个xml,接着开始发起支付调用pay(); 2.发起支付 /** * 发起支付请求 */ public void pay(Map<String,String> map){ Map<String,String> keyValues = new HashMap<>(); keyValues.put("appid",map.get("appid")); keyValues.put("partnerid",Constant.WEIXIN_CUSTOMER_ID); keyValues.put("prepayid",map.get("prepay_id")); keyValues.put("package","Sign=WXPay"); keyValues.put("noncestr",map.get("nonce_str")); String timestamp = System.currentTimeMillis()+""; keyValues.put("timestamp",timestamp); //签名 String sign = WeiXinTool.getSign(keyValues, Constant.WEIXIN_APP_KEY); PayReq req = new PayReq(); req.appId = map.get("appid"); req.prepayId = map.get("prepay_id"); req.nonceStr = map.get("nonce_str"); req.sign = sign; //req.extData = "app data"; // optional req.timeStamp = timestamp; //这里注意,不能再写System.currentTimeMillis(),因为时间已经不一样,否则会报签名错误 req.packageValue = "Sign=WXPay"; req.partnerId = Constant.WEIXIN_CUSTOMER_ID; //Toast.makeText(PayActivity.this, "正常调起支付", Toast.LENGTH_SHORT).show(); // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信 //这里只用使用微信demo中提交request即可 MyApplication.getInstance().getApi().sendReq(req); } 其实统一订单应该放在服务器端处理!
    转载请注明原文地址: https://ju.6miu.com/read-1124181.html

    最新回复(0)