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