微信app支付需要关联微信商户平台创建app应用,和公众号及H5支付不同,支付时使用的appid也是开放平台的appid,
1.微信开放平台申请支付
没有账号具体参考官方文档:https://kf.qq.com/faq/1612267j2eQ3161226jIVbA3.html
2.统一下单,返回支付参数
public function unifiedOrder($params) {
$data = array();
$data["appid"] = $this->_config["appid"]; // 公众账号ID
$data["mch_id"] = $this->_config["mch_id"]; // 商户号
$data["device_info"] = (isset($params['device_info'])&&trim($params['device_info'])!='')?$params['device_info']:null; // device_info 设备号
$data["nonce_str"] = $this->get_nonce_string(); // 随机字符串
$data["body"] = $params['body']; // 商品描述
$data["detail"] = isset($params['detail'])?$params['detail']:null;//optional 商品详情
$data["attach"] = isset($params['attach'])?$params['attach']:null;//optional 附加数据
$data["out_trade_no"] = isset($params['out_trade_no'])?$params['out_trade_no']:null; // 商户订单号
$data["fee_type"] = isset($params['fee_type'])?$params['fee_type']:'CNY'; // 标价币种
$data["total_fee"] = $params['total_fee']; // 标价金额
$data["spbill_create_ip"] = $params['spbill_create_ip']; // 终端IP
$data["time_start"] = isset($params['time_start'])?$params['time_start']:null;//optional 交易起始时间
$data["time_expire"] = isset($params['time_expire'])?$params['time_expire']:null;//optional 交易结束时间
$data["goods_tag"] = isset($params['goods_tag'])?$params['goods_tag']:null; // 订单优惠标记
$data["notify_url"] = $params['notify_url']; // 通知地址
$data["trade_type"] = $params['trade_type']; // 交易类型
//$data["product_id"] = isset($params['product_id'])?$params['product_id']:null;//required when trade_type = NATIVE 商品ID
//$data["openid"] = isset($params['openid'])?$params['openid']:null; // 用户标识
//$data["scene_info"] = isset($params['scene_info'])?$params['scene_info']:null;// scene_info 场景信息 (h5支付必填)
$data["limit_pay"] = isset($params['limit_pay'])?$params['limit_pay']:null;//指定支付方式 no_credit--指定不能使用信用卡支付
$data["receipt"] = isset($params['receipt'])?$params['receipt']:null;//开发票入口开放标识
$result = $this->post(self::URL_UNIFIEDORDER, $data);
return $result;
}
注意:app的统一下单有几个参数与公众号和H5不同,针对不同的支付类型需要看清楚参数,如果不需要的参数可直接为NULL,拼接时给过滤掉
3.调起支付
目前我使用的是Hbuilder打包的app,调起支付用的是plus.payment.getChannels
// 微信app支付
plus.payment.getChannels((channels) => {
try {
let c = channels.find(e => e.id === 'wxpay') || {serviceReady: false}
console.log(c.serviceReady)
if(!c.serviceReady){
alert('未安装微信')
return
}
plus.payment.request(c, res.data.pay_params, () => {
console.log("支付成功")
// 跳转到支付成功页面
that.payResult(campusId, verificationCode);
}, function(e){
console.log("支付失败")
// that.payResult(campusId, verificationCode);
alert("支付失败:"+e.message)
} )
} catch (error) {
console.log('异常')
console.log(error)
}
}, function(e){
console.log("获取支付通道列表失败:"+e.message)
})
res.data.pay_params就是接口返回的APP支付调用参数,示例:
{
"appid": 开放平台appId,
"noncestr": "b10mnlov3iqpr62gsdjf45zuktcha89e", //随机字符串
"package": "Sign=WXPay",
"partnerid": 商户号 ,
"prepayid": 预支付交易会话id,
"timestamp":1578908835, //时间戳
"sign": that.payData.sign, //微信签名
}
4.发布APP
正式环境与测试环境,发布APP是需要申请安卓和IOS的包名与秘钥证书
5.其他
我在开发是遇到的一些问题:
1.appid与mch_id不匹配
appid是微信开放平台申请的APP的appid,和公众号appid不要搞混了
2.IOS调起支付时报错error:-1
打包后没有替换证书和秘钥,使用的是测试环境的证书
3.安卓调起支付时报错error:-100
安卓申请支付需要客户配置秘钥,当时秘钥配置不对,支付时报错
网友评论