在数字化时代,移动支付已成为人们生活中不可或缺的一部分。公众号支付作为一种新兴的支付方式,因其便捷性和广泛的应用场景,越来越受到开发者和商家的青睐。本文将带你从入门到精通,轻松掌握公众号支付的开发流程与接口操作。
一、公众号支付简介
1.1 定义
公众号支付是微信支付提供的一种支付方式,用户可以通过微信公众号进行商品或服务的支付。
1.2 优势
- 便捷性:用户无需离开公众号,即可完成支付操作。
- 安全性:采用微信支付安全体系,保障支付安全。
- 可定制性:支持自定义支付界面,提升品牌形象。
二、公众号支付开发入门
2.1 开发环境搭建
- 注册微信支付:首先,你需要注册一个微信支付商户号,并获取相关配置信息。
- 选择开发语言:公众号支付支持多种开发语言,如Java、PHP、Python等,根据个人喜好和项目需求选择合适语言。
- 了解微信支付API:熟悉微信支付API的接口、参数和返回结果,为后续开发做好准备。
2.2 公众号支付流程
- 用户发起支付:用户在公众号中点击支付按钮,系统将调用微信支付API生成预支付交易会话标识。
- 调用API:开发者根据返回的预支付交易会话标识,调用微信支付API生成支付页面。
- 用户完成支付:用户在支付页面完成支付操作。
- 异步通知:支付完成后,微信支付会发送异步通知到商户服务器,告知支付结果。
三、公众号支付接口操作详解
3.1 统一支付接口
统一支付接口是公众号支付的核心接口,主要负责生成预支付交易会话标识、查询订单状态等功能。
3.1.1 生成预支付交易会话标识
public String unifiedOrder(String body, String outTradeNo, String totalFee) {
// 构建请求参数
Map<String, String> data = new HashMap<>();
data.put("appid", APPID);
data.put("mch_id", MCH_ID);
data.put("nonce_str", generateNonceStr());
data.put("body", body);
data.put("out_trade_no", outTradeNo);
data.put("total_fee", totalFee);
data.put("spbill_create_ip", getIp());
data.put("notify_url", NOTIFY_URL);
data.put("trade_type", "JSAPI");
// 生成签名
String sign = generateSign(data);
// 构建请求体
String xml = "<xml>";
xml += "<appid>" + APPID + "</appid>";
xml += "<mch_id>" + MCH_ID + "</mch_id>";
xml += "<nonce_str>" + data.get("nonce_str") + "</nonce_str>";
xml += "<sign>" + sign + "</sign>";
xml += "<body>" + body + "</body>";
xml += "<out_trade_no>" + outTradeNo + "</out_trade_no>";
xml += "<total_fee>" + totalFee + "</total_fee>";
xml += "<spbill_create_ip>" + getIp() + "</spbill_create_ip>";
xml += "<notify_url>" + NOTIFY_URL + "</notify_url>";
xml += "<trade_type>JSAPI</trade_type>";
xml += "</xml>";
// 发送请求
String result = httpsPost("https://api.mch.weixin.qq.com/pay/unifiedorder", xml);
// 解析返回结果
JSONObject jsonObject = JSONObject.parseObject(result);
String prepay_id = jsonObject.getString("prepay_id");
return prepay_id;
}
3.1.2 查询订单状态
public String orderQuery(String outTradeNo) {
// 构建请求参数
Map<String, String> data = new HashMap<>();
data.put("appid", APPID);
data.put("mch_id", MCH_ID);
data.put("nonce_str", generateNonceStr());
data.put("out_trade_no", outTradeNo);
// 生成签名
String sign = generateSign(data);
// 构建请求体
String xml = "<xml>";
xml += "<appid>" + APPID + "</appid>";
xml += "<mch_id>" + MCH_ID + "</mch_id>";
xml += "<nonce_str>" + data.get("nonce_str") + "</nonce_str>";
xml += "<sign>" + sign + "</sign>";
xml += "<out_trade_no>" + outTradeNo + "</out_trade_no>";
xml += "</xml>";
// 发送请求
String result = httpsPost("https://api.mch.weixin.qq.com/pay/orderquery", xml);
// 解析返回结果
JSONObject jsonObject = JSONObject.parseObject(result);
String trade_state = jsonObject.getString("trade_state");
return trade_state;
}
3.2 JSAPI支付接口
JSAPI支付接口允许你在公众号中调用微信JS-SDK,实现支付功能。
3.2.1 调用JSAPI支付
function onBridgeReady() {
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId": "wx2421b1c4370ec43b", // 公众号名称,由商户传入
"timeStamp": "1395712654", // 时间戳,自1970年以来的秒数
"nonceStr": "e61463f8efa94090b1f366cccfbbb444", // 随机串
"package": "prepay_id=u802345jgfjsdfgsdg888",
"signType": "MD5", // 微信签名方式:
"paySign": "70EA570631E4BB79628FBCA90534C63FF7FADD89" // 微信签名
},
function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ) {
// 使用以上方式判断前端返回,微信团队郑重提示:
// res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
}
}
);
}
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
}
}else{
onBridgeReady();
}
四、总结
公众号支付作为一种便捷的支付方式,具有广泛的应用前景。通过本文的介绍,相信你已经对公众号支付的开发流程与接口操作有了全面的认识。在实际开发过程中,还需不断积累经验,优化支付体验。祝你早日精通公众号支付开发!
