微信小程序支付及退款流程详解
支付流程
1. 获取openid
在发起支付前,需要获取用户的openid。可以通过调用微信官方提供的登录接口wx.login(),在获取到临时登录凭证code后,再通过调用wx.request()接口向服务器发送请求,从而获取用户的openid。
示例代码:
wx.login({
success: function(res) {
if (res.code) {
wx.request({
url: 'https://api.weixin.qq.com/sns/jscode2session',
data: {
appid: 'YOUR_APP_ID',
secret: 'YOUR_APP_SECRET',
js_code: res.code,
grant_type: 'authorization_code'
},
success: function(res) {
console.log(res.data)
// 获取openid
var openid = res.data.openid;
}
})
} else {
console.log('登录失败!' + res.errMsg)
}
}
})
2. 创建订单
创建订单需要向自己的后台服务器发送请求,由后台服务器调用微信支付统一下单接口,返回预付单信息。
示例代码:
// 向微信支付统一下单接口发送请求
$post_data = array(
'appid' => 'YOUR_APP_ID',
'mch_id' => 'YOUR_MCH_ID',
'nonce_str' => '随机字符串',
'body' => '商品描述',
'out_trade_no' => '商户订单号',
'total_fee' => '订单金额',
'spbill_create_ip' => $_SERVER['REMOTE_ADDR'],
'notify_url' => '支付结果通知url',
'trade_type' => 'JSAPI',
'openid' => $openid
);
$post_data['sign'] = sign($post_data, 'YOUR_APP_KEY');
$xml = arrayToXml($post_data);
$response = postXmlCurl('https://api.mch.weixin.qq.com/pay/unifiedorder', $xml);
// 解析微信支付统一下单接口返回的结果
$result = xmlToArray($response);
if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') {
// 获取预支付交易会话标识
$prepay_id = $result['prepay_id'];
$nonceStr = createNonceStr();
// 生成签名
$data = array(
'appId' => 'YOUR_APP_ID',
'timeStamp' => strval(time()),
'nonceStr' => $nonceStr,
'package' => 'prepay_id=' . $prepay_id,
'signType' => 'MD5'
);
$data['paySign'] = sign($data, 'YOUR_APP_KEY');
// 将支付参数返回给小程序
echo json_encode($data);
} else {
echo $result['return_msg'];
}
3. 发起支付
通过wx.requestPayment()接口发起支付。
示例代码:
wx.requestPayment({
timeStamp: '',
nonceStr: '',
package: '',
signType: 'MD5',
paySign: '',
success: function(res) {
console.log('支付成功!')
}
})
退款流程
1. 创建退款订单
在小程序后台管理界面设置退款规则,用户申请退款后,小程序会向自己的后台服务器发送请求,由后台服务器调用微信支付申请退款接口,返回退款结果。
示例代码:
// 向微信支付申请退款接口发送请求
$post_data = array(
'appid' => 'YOUR_APP_ID',
'mch_id' => 'YOUR_MCH_ID',
'nonce_str' => '随机字符串',
'out_trade_no' => '商户订单号',
'out_refund_no' => '商户退款单号',
'total_fee' => '订单金额',
'refund_fee' => '退款金额',
'refund_desc' => '退款原因',
'refund_account' => '退款资金来源',
);
$post_data['sign'] = sign($post_data, 'YOUR_APP_KEY');
$xml = arrayToXml($post_data);
$response = postXmlCurl('https://api.mch.weixin.qq.com/secapi/pay/refund', $xml);
// 解析微信支付申请退款接口返回的结果
$result = xmlToArray($response);
if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') {
echo '退款成功';
} else {
echo $result['return_msg'];
}
2. 查询退款订单状态
调用微信支付查询退款接口查询退款订单状态。
示例代码:
// 向微信支付查询退款接口发送请求
$post_data = array(
'appid' => 'YOUR_APP_ID',
'mch_id' => 'YOUR_MCH_ID',
'nonce_str' => '随机字符串',
'out_trade_no' => '商户订单号',
);
$post_data['sign'] = sign($post_data, 'YOUR_APP_KEY');
$xml = arrayToXml($post_data);
$response = postXmlCurl('https://api.mch.weixin.qq.com/pay/orderquery', $xml);
// 解析微信支付查询退款接口返回的结果
$result = xmlToArray($response);
if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') {
if ($result['refund_status_0'] == 'SUCCESS') {
echo '退款成功';
} else {
echo '退款失败';
}
} else {
echo $result['return_msg'];
}
示例说明
支付流程
假如某个用户在你的小程序中购买了一件商品,价格为99元,订单号为1234567890。那么支付流程如下:
-
用户点击“立即购买”按钮,小程序调用wx.login()接口,获取用户的openid。
-
小程序向自己的后台服务器发送请求,由后台服务器调用微信支付统一下单接口,返回预付单信息。预付单信息中包含了相关的支付参数,如:时间戳、随机字符串、预支付交易会话标识等。
-
小程序通过wx.requestPayment()接口发起支付,用户需要输入密码完成支付。
-
支付成功后,微信服务器通知小程序的服务器支付成功的消息,并携带支付订单信息。
-
小程序的后台服务器收到支付成功的消息后,更新订单状态,并向用户发送支付成功的消息。
退款流程
假如某个用户购买了你的小程序中的一件商品,并申请退款。那么退款流程如下:
-
用户在小程序中申请退款,小程序会向自己的后台服务器发送请求。
-
后台服务器调用微信支付申请退款接口,返回退款结果。
-
后台服务器调用微信支付查询退款接口,查询退款订单状态。
-
如果退款成功,则更新订单状态,并向用户发送退款成功的消息。如果退款失败,则向用户发送退款失败的消息。
以上就是微信小程序支付及退款流程的详细攻略。希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:微信小程序支付及退款流程详解 - Python技术站