最近有个业务是做一个短剧小程序,根据微信支付的要求,短剧类目需要接入虚拟支付.小程序中涉及游戏币,VIP等均属于虚拟支付范畴.
首先,需要在小程序后台申请开通虚拟支付,这里按小程序后台的照流程走,开通即可,本文主要讲一下代码实现:
PHP代码
//先生成一个订单
$insert_payment = [
'uid' => $this->user_id,
'openid' => $this->user_info['openid'],
'pro_id' => $product_id,
'video_id' => $video_id,
'pay_status' => 1,
'money' => $money,
'coins_num' => $products[$product_id]['coins_num'],
'coins_gift' => $products[$product_id]['coins_num'],
];
$payment = Payment::query()->create($insert_payment);
$pay_id = $payment->pay_id;
$offerId = 'xxxxxxx';//微信小程序虚拟支付页面-基本信息中找
$signData = [
'offerId' => $offerId,
'buyQuantity' => $products[$product_id]['coins_num'],//购买币的数量,他会自动根据兑换比例让全端支付前
'env' => 0,//环境配置, 0 米大师正式环境, 1 米大师沙箱环境, 默认为 0
'currencyType' => 'CNY',
'platform' => 'android',//截止2023年10月19日18:58:01仅支持安卓虚拟支付
'outTradeNo' => 'outTradeNo_' . $pay_id,//订单号,注意长度和格式
'attach' => $video_id//其他参数
];
$appkey = 'xxxxxxxxxxxx';//微信小程序虚拟支付页面-基本信息中找,有两个正式和沙箱,注意跟上面签名数据中的env字段对应
//下面的requestVirtualPayment是下单拉起支付的参数,微信文档中还有很多其他参数比如:查询和创建订单接口query_data,请根据文档自行组织$signData
$need_sign_msg = 'requestVirtualPayment&' . json_encode($signData);
$pay_sing = hash_hmac('sha256', $need_sign_msg, $appkey);//生成支付签名
$need_sign = json_encode($signData);
$session_key = $this->user_info['session_key'];这个session_key是在用code换取openid接口中同openid一起返回的返回的(查阅code2Session接口)
$signature = hash_hmac('sha256', $need_sign, $session_key);//生成用户态签名
//将生成的数据发送给前端,下面三个参数是前端调起支付的必要数据
$this->pagedata['signData'] = $signData;
$this->pagedata['pay_sing'] = $pay_sing;
$this->pagedata['signature'] = $signature;
前端的代码就不贴了,主要是使用上面代码中生成的三个参数,调用
wx.requestVirtualPayment
方法拉起支付即可.
如果拉不起来,就在小程序后台虚拟支付中看看自己的道具设置 或者 人民币和虚拟币的兑换比例 设置没有设置好.
最后,服务端还需要注意,要提供一个url推送地址来接收用户支付成功的消息,就跟jsapi类似,不过不能跟jsapi支付的回调地址一样,要单独写,如果你的项目中有接收微信推送的事件的地址,则不用单独写.这个推送地址也在小程序后台开发管理-开发设置-消息推送中配置
支付成功后微信推送一个事件给你,事件的消息内容:
{
"ToUserName":"xxxx",
"FromUserName":"xxxxxx",
"CreateTime":1697705319,
"MsgType":"event",
"Event":"xpay_coin_pay_notify",
"OpenId":"xxxxxxx",
"OutTradeNo":"outTradeNo_86",
"WeChatPayInfo":{
"MchOrderNo":"xxxxxx",
"TransactionId":"xxxxxxxxx",
"PaidTime":1697705318
},
"Env":0,
"CoinInfo":{
"Quantity":690,
"OrigPrice":1,
"ActualPrice":1,
"Attach":""
},
"RetryTimes":0
}
你收到消息以后修改订单状态即可(微信还提供了另外一种方式,自己查看文档,微信说两个一起用更可靠).