微信支付功能--APP支付功能
微信APP支付
首先通过java服务端拼接支付参数发送请求到微信服务器,微信服务器会返回一个“prepay_id” 数值,然后通过prepay_id与一些其他属性生成一个MD5的签名,将签名信息返回给APP客户端,最后由APP客户端唤醒微信APP应用进行支付。
支付成功后,微信服务器会异步请求java服务器,告诉服务器该订单支付状态。
下单代码如下:
/**
* @Title: appUnifiedorder
* @Description: APP下单
* @author pj
* @date 2016年8月18日 下午3:37:23
* @param notifyUrl
* @param productName
* @param orderNum
* @param price
* @param ipLocal
* @return
*/
public static Map<String,Object> appUnifiedorder(String mch_id, String appId,String notifyUrl,String productName,String orderNum,Double price,String ipLocal){
Map<String,Object> map = new HashMap<String, Object>();
//金额转为分单位
Double expandPrice = price*100;
//转int类型
Integer totalFee = expandPrice.intValue();
TreeMap<Object, Object> packageParams = new TreeMap<Object, Object>();
packageParams.put("appid",appId);
packageParams.put("mch_id",mch_id);//设置商户号
packageParams.put("nonce_str",Sha1Util.getNonceStr());
packageParams.put("body", productName); //商品描述
packageParams.put("out_trade_no", orderNum); //商户订单号
packageParams.put("fee_type","CNY"); //银行币种
packageParams.put("total_fee", totalFee); //商品总金额,以分为单位
packageParams.put("spbill_create_ip",ipLocal); //订单生成的机器IP,指用户浏览器端IP
packageParams.put("notify_url",notifyUrl); //通知地址
packageParams.put("trade_type", "APP"); //交易类型
try {
//调用获取订单接口,并返回相关参数
Map<String,Object> payMap = WXPrepay.submitXmlGetPrepayId(packageParams);
String appid = payMap.get("appid").toString();
String nonce_str = payMap.get("nonce_str").toString();
String prepay_id = payMap.get("prepay_id").toString();
String sign = "";
String timeStamp = Sha1Util.getTimeStamp();
//拼接自定义参数,并生成支付签名
SortedMap<Object, Object> signParams = new TreeMap<Object, Object>();
signParams.put("appid",appId);
signParams.put("partnerid", mch_id);
signParams.put("prepayid", prepay_id);
signParams.put("package", "Sign=WXPay");
signParams.put("noncestr", nonce_str);
signParams.put("timestamp", timeStamp);
sign = Sha1Util.createMD5Sign(signParams);
//返回调用支付api所用的数据
map.put("appId", appid);
map.put("partnerId", mch_id);
map.put("prepayId", prepay_id);
map.put("packages", "Sign=WXPay");
map.put("nonceStr", nonce_str);
map.put("timeStamp", timeStamp);
map.put("paySign", sign);
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
详细代码请查看WXUnifiedOrderUtil.java 文件,此代码仅供参考
业务流程图;
商户系统和微信支付系统主要交互说明:
步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。
步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。参见【统一下单API】。
步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay
步骤4:商户APP调起微信支付。api参见本章节【app端开发步骤说明】
步骤5:商户后台接收支付通知。api参见【支付结果通知API】
步骤6:商户后台查询支付结果。,api参见【查询订单API】
版权所属:SO JSON在线解析
原文地址:https://www.sojson.com/blog/181.html
转载时必须以链接形式注明原始出处及本声明。
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。