支付接口 - 微信,支付宝
在hbuider下的app 调用支付接口
支付宝功能申请
- 登录支付宝账号,签约申请“移动快捷支付”功能,操作流程参考:
支付宝帮助中心
- 获取PID,参考教程:
获取合作者身份ID
服务器生成订单示例(PHP)
参考开源示例代码github-支付宝
C#生成支付宝订单示例
微信支付功能申请
-
使用微信支付功能需到微信开放平台申请移动应用并开通支付功能
微信APP支付接入商户服务中心
申请应用后可以获取AppID和AppSecret值。
-
开通支付功能后可获取支付业务服务器配置数据
PARTNER:财付通商户号
PARTNER_KEY:财付通密钥
PAYSIGNKEY:支付签名密钥
参考开源示例代码github-微信支付
$result = array( ‘appid‘ => $appid, ‘noncestr‘=>$parameters[‘nonce_str‘], ‘package‘=>‘Sign=WXPay‘, ‘partnerid‘=>$mch_id, ‘prepayid‘=>$prepay_id, ‘timestamp‘=> time(), ); // 重新签名 $result[‘sign‘] = $this->getSign($result, $key);
调起启用支付宝或微信 plus.payment.request(pay[id].order,function(result)
微信遇到的问题: 启动微信(需要打包测试,其中app签名确保和微信签名对应),确保获取order的值是否正确,其中,注意sigh=两次重新生成,格式为order
字段名 | 变量名 | 类型 | 必填 | 示例值 | 描述 |
---|---|---|---|---|---|
应用ID | appid | String(32) | 是 | wx8888888888888888 | 微信开放平台审核通过的应用APPID |
商户号 | partnerid | String(32) | 是 | 1900000109 | 微信支付分配的商户号 |
预支付交易会话ID | prepayid | String(32) | 是 | WX1217752501201407033233368018 | 微信返回的支付交易会话ID |
扩展字段 | package | String(128) | 是 | Sign=WXPay | 暂填写固定值Sign=WXPay |
随机字符串 | noncestr | String(32) | 是 | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | 随机字符串,不长于32位。推荐随机数生成算法 |
时间戳 | timestamp | String(10) | 是 | 1412000000 | 时间戳,请见接口规则-参数规定 |
签名 | sign | String(32) | 是 | C380BEC2BFD727A4B6845133519F3AD6 | 签名,详见签名生成算法 |
支付宝:主要密钥是否正确 出现al59错误->确保每一个值都不为空
其中order格式
"service=\"mobile.securitypay.pay\"&partner=\"2088002409047871\"&_input_charset=\"UTF-8\"&out_trade_no=\"14682865347699\"&subject=\"余额充值\"&payment_type=\"1\"&seller_id=\"tfshop@126.com\"&total_fee=\"0\"&body=\"\"&it_b_pay=\"1d\"¬ify_url=\"http%3A%2F%2Fwww.taifengmall.com%2Fopenapi%2Fectools_payment%2Fparse%2Fectools_payment_plugin_alipayapp%2Fcallback%2F\"&sign=\"GGxRnW%2FxgYmf582zggZCZFw%2FY1nhHJRptUzHIqCT9SvsJxs4bcoOzo4cEoBkyFultEr2CowQEGAgradEtTrsZI9TSK3Rv0IheBS0EP28cSqZYOQH%2BLXqsmzI2nZiJ%2BYYD0zFcS45yzYAEn4ll8Fx4subACEzLzIM%2BBxYwHcp43g%3D\"&sign_type=\"RSA\""
遇到的问题:body为空,total_fee为0
遇到的写法js写法:
$(‘body‘).on(‘ajaxSubmit.success‘, ‘#paycenter-form‘, function (e, data){
var paytype_id = $(‘input[name=payment]:checked‘).val();
$.payment($.paymentmapping[paytype_id], data, function (result){...}});
$.payment = function (type, data, successCallback, failCallback){
// 支付方式名称转换,服务端与客户端的映射
$.paymentmapping = {
‘wxpayapp‘: ‘wxpay‘,
‘alipayapp‘: ‘alipay‘
};
})(jQuery);
参考文档
支付结果返回处理
支付宝
$this->callback_url = kernel::openapi_url(‘openapi.ectools_payment/parse/ectools/ectools_payment_plugin_alipayapp‘, ‘callback‘);
public function dopay($payment) { $mer_id = trim($this->getConf(‘mer_id‘, __CLASS__)); // 支付宝合作者身份ID,以2088开头的16位纯数字 $seller_id = trim($this->getConf(‘seller_id‘, __CLASS__)); // 支付宝账号 $rsa_private_key = trim($this->getConf(‘rsa_private_key‘, __CLASS__)); // 私钥字符串 $this->add_field(‘service‘, ‘mobile.securitypay.pay‘); // 必填,接口名称,固定值 $this->add_field(‘partner‘, $mer_id); // 必填,合作商户号 $this->add_field(‘_input_charset‘, ‘UTF-8‘); // 必填,参数编码字符集 $this->add_field(‘out_trade_no‘, $payment[‘payment_id‘]); // 必填,商户网站唯一订单号 $this->add_field(‘subject‘, $payment[‘shopName‘]); // 必填,商品名称 $this->add_field(‘payment_type‘, ‘1‘); // 必填,支付类型 $this->add_field(‘seller_id‘, $seller_id); // 必填,卖家支付宝账号 $this->add_field(‘total_fee‘, floatval($payment[‘total_amount‘])); // 必填,总金额,取值范围为[0.01,100000000.00] $this->add_field(‘body‘, $payment[‘body‘]); // 必填,商品详情 $this->add_field(‘it_b_pay‘, ‘1d‘); // 可选,未付款交易的超时时间 $this->add_field(‘notify_url‘,urlencode($this->callback_url)); // 可选,服务器异步通知页面路径 if($payment[‘show_url‘]){ $this->add_field(‘show_url‘, urlencode($payment[‘show_url‘])); // 可选,商品展示网站 } //生成订单 return $this->generate(trim($rsa_private_key)); } /** * 支付后返回后处理的事件的动作 * @params array - 所有返回的参数,包括POST和GET * @return null */ public function callback(&$recv) { $mer_id = trim($this->getConf(‘mer_id‘, __CLASS__)); // 支付宝合作者身份ID,以2088开头的16位纯数字 if($this->is_return_vaild($recv, $recv[‘sign‘])){ $ret[‘payment_id‘] = $recv[‘out_trade_no‘]; $ret[‘account‘] = $mer_id; $ret[‘bank‘] = app::get(‘ectools‘)->_(‘支付宝支付移动版‘); $ret[‘pay_account‘] = app::get(‘ectools‘)->_(‘付款帐号‘); $ret[‘currency‘] = ‘CNY‘; $ret[‘money‘] = $recv[‘total_fee‘]; $ret[‘paycost‘] = ‘0.000‘; $ret[‘cur_money‘] = $recv[‘total_fee‘]; $ret[‘trade_no‘] = $recv[‘trade_no‘]; $ret[‘t_payed‘] = strtotime($recv[‘notify_time‘]) ? strtotime($recv[‘notify_time‘]) : time(); $ret[‘pay_app_id‘] = "alipayapp"; $ret[‘pay_type‘] = ‘online‘; $ret[‘memo‘] = $recv[‘body‘]; switch($recv[‘trade_status‘]){ case ‘TRADE_SUCCESS‘: $ret[‘status‘] = ‘succ‘; echo ‘success‘; break; } }else{ $message = ‘Invalid Sign‘; $ret[‘status‘] = ‘invalid‘; echo ‘fail‘; } return $ret; }
notify_url 接口异步通知url
http://ask.dcloud.net.cn/docs/#http://ask.dcloud.net.cn/article/71
个人总结,遇到问题,先看例子的返回值是怎样的,然后对比一下,记得看清楚,每一步的作用,一步一步解决