前言:
支付类的东西都是按照官方写的文档一步一步来就可以搞定,关键就是第一次弄,一脸懵,不成功就很烦躁,这次项目用的是hbuilder打包的app方式,框架用的是mui,其实app支付的重点就是在签名这块,官方有工具可以验签,一般签名不错的话就差不多成功了,下面干活。
后台主要代码:
public String alipayMobile(OrderDetail orderdetail) throws AlipayApiException {
Map<String,String> map = new TreeMap<String, String>();
//bizcontent(业务字段)
Map<String,String> bizMap = new HashMap<String,String>();
bizMap.put("subject", orderdetail.getRoomName());//我这里用的是房间名字,根据业务写
bizMap.put("out_trade_no", orderdetail.getOrderCode());//订单号
bizMap.put("total_amount", orderdetail.getTradeAmt()+"");//金额
bizMap.put("product_code", "QUICK_MSECURITY_PAY");//固定的
String bizStr = JSON.toJSONString(bizMap);
map.put("app_id", app_id);//自己的appid(申请的时候有的)
map.put("method", "alipay.trade.app.pay");(就写这个)
map.put("charset", "utf-8");
map.put("sign_type", "RSA2");
map.put("timestamp", DateTimeUtil.getDateString19());//时间格式参照官方给的中间有空格
map.put("version", "1.0");
map.put("notify_url", notify_url);//你的回调地址(异步通知用)
map.put("biz_content", bizStr);//业务字段
//拼接好的含有&的字符串
String jsonStr2 = AlipaySignature.getSignContent(map);
//获取签名(支付宝官方api)
String sign = AlipaySignature.rsaSign(jsonStr2,merchant_private_key,"utf-8","RSA2");
map.put("sign", sign);
//对value值进行url编码
for(Map.Entry<String, String> map2:map.entrySet()){
String key = map2.getKey();
String value = map2.getValue();
value = URLEncoder.encode(value);
map.put(key, value);
}
//获取最终的json串(支付宝官方api)
String realStr = AlipaySignature.getSignContent(map);
return realStr;
}
以上就可以获取返回前台的字符串啦。。。
再看看hbuilder里写的代码(前台)
manifest.json中
前台js里
var aliChannel = null; // 支付宝支付
var channel = null;
// 获取支付通道
plus.payment.getChannels(function(channels){
aliChannel=channels[0];
},function(e){
alert("获取支付通道失败:"+e.message);
});
plus.nativeUI.showWaiting();
mui.post(访问后台的url, function(data) {
plus.nativeUI.closeWaiting();
channel = aliChannel;
console.log(data);
if (data) {
plus.payment.request(channel, data, function(result) {
console.log(JSON.stringify(result));
mui.alert("付费成功");
}, function(e) {
console.log(JSON.stringify(e));
alert(JSON.stringify(e));
mui.alert("付费失败");
});
} else {
plus.nativeUI.alert("支付失败");
}
});
晚上以上代码就ok了,不成功的多注意一下签名是否正确,我自己测试的时候不用打包成app也可以成功的。。