扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
1、首先,你要有一间五证齐全的公司
成都创新互联专注于綦江网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供綦江营销型网站建设,綦江网站制作、綦江网页设计、綦江网站官网定制、小程序定制开发服务,打造綦江网络公司原创品牌,更为您提供綦江网站排名全网营销落地服务。
2、然后用这些材料,去支付宝注册一个商家账户(审核周期大概5个工作日),或者微信的开发者账号(审核周期大概5个工作日,300元费用),或者银联、paypal(这俩个我不太熟悉)
3、然后申请开通手机端的支付产品,支付宝的话就是“移动快捷支付”(支付时跳转到支付宝APP,需要用户安装支付宝APP),或者“移动WAP网页支付”(支付时打开一个WebView里边登陆支付宝进行支付),微信的话,需要你的app已经上架有了APPID,才能开通;大概也是5个工作日
4、然后就是技术集成了,支付宝和微信会提供给你一个32位的秘钥,用于防篡改效验(或者你采用RSA加密的话,需要给他上传你的公钥);你需要有一个自己的支付后台服务器,来处理加密、获取支付令牌的后台处理;
5、把你的APP和你的支付后台接通,就可以在APP端使用第三方支付了
你只要自己保管好账户信息 不要透露给别人 特别是密码类的 另外不要点击陌生链接文件压缩包之类的东西或者让陌生人远程控制等就可以了
可以先去下载一个的有源码DEMO。
现在的SDK改名叫移动支付集成开发包。
步骤方法:
1、调用支付宝支付接口
2、处理支付宝返回的支付结果
在调用支付宝支付接口前,还需要先生成一个订单,文档中描述时,是将这步也放在客户端来做了,但也可以在服务器端生成这个订单(图中支付宝会在支付成功后通知服务器端,所以在服务器端生成订单的话,可以掌握所有订单,而且也会更安全):
生成订单(可以在iOS客户端内生成,也可以在服务器端生成)。
3、调用支付宝支付接口,发送订单
4、处理支付宝返回的支付结果
其实对于业务来说,这些步骤已经够了,但是有一个安全性问题,不希望接收到的支付结果被截获修改,所以,这就需要在生成订单和处理支付结果的时候做一个安全性校验:
生成订单时对数据签名,收到支付结果时对数据进行签名验证,以检验数据是否被篡改过。
5、采用RSA加密方式做签名验证。
付宝SDK-------DEMO第一次编译肯定是会报错的:
修正的方法为:
打开项目属性-Build Settings 找到 Library SearchPaths
看见里面的参数了吗,把\\\都去掉,然后再编译就好了。(注意前后都去掉)
个人开发者的话可以用bmob提供的支付sdk,支持支付宝支付,不用企业资质也可以快速接入。不过这个问题是12年的了,哈哈,那时候好像还没有这个支付sdk。。看到了还是给你推荐一下,即使是现在,支持个人开发者接入支付的sdk还是很少的,所以它算是个人开发的福音吧。。
接入支付宝支付SDK
可以说支付宝支付接入是所有SDK最好接入的,没有之一。
客户端不用签名,也不用管包名,也不用管签名文件,就接口返回订单,把订单交给支付宝SDK调用就行,成功或者失败都在当前界面返回给你。你再去通知接口。
支付流程图
官方文档地址
!支付宝支付官方文档地址
按照文档说明接入SDK和相关配置,在这就不重复了
客户端支付关键代码===》支付接口的调用(调起支付弹框)
记住支付接口的调用必须在独立的非ui线程中执行,即需新开线程里面调用。可以想官方demo一样用new Thread方式。
下面我给出用Observable方式示例代码
在PayUtils中
/**
* desc:支付宝支付
* Created by congge on 2018/8/27 17:20
* @param orderInfo 接口返回的订单
**/
public static void aliPay(final Activity activity, final String orderInfo, final OrderListener orderListener) {
Observable.just(orderInfo)
.map(new Function () {
@Override
public String apply(String orderInfo) throws Exception {
//用户在商户app内部点击付款,是否需要一个loading做为在钱包唤起之前的过渡,这个值设置为true
return new PayTask(activity).pay(orderInfo, true);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer () {
@Override
public void accept(String payResult) throws Exception {
orderListener.onPayResult(payResult);
}
});
}
支付结果返回处理
返回例子:
resultStatus={9000};memo={};result={{"alipay_trade_app_pay_response":{"code":"10000","msg":"Success","app_id":"2016091300503896","auth_app_id":"2016091300503896","charset":"utf-8","timestamp":"2018-08-28 17:51:11","out_trade_no":"nVElbd74TW6WnEyxQwvX8A","total_amount":"0.01","trade_no":"2018082821001004680500208879","seller_id":"2088102175487650"},"sign":"W0Hg9k4GxL8Oaxymvqk2i65WNDQxYp6HGve32ek6VjSRnymmI3GQTjpQVbZuDzvjcwQ/HIkM97PoBGAVlTmi/wiJcqDgSSDzDY7AFnNN0OcK0ehWGwKQINA4IDGh51A7yY/vYKmR0VW+2OwGhlRPPMMZtQOEqh8a9/aIijzT6ZLwy9Hl4ayG/fVKhdC1VdckF6+C25BFNp3fIxarg5tfEunm7N9iWngKCUsnP+IZz05OHdvynimgYPcBnbBERHG97GVqRT/EdBWTQyIDMc0LemScAYxJixTVgXDkRddQjzWZ7HgLdBfjs0nXY24puHudT76ERxVY+8NkoKle/QI+FA==","sign_type":"RSA2"}}
也可以自己打log看看
处理示例代码:
//支付宝支付
PayUtils.aliPay(this, result.getSignDataStr(), new PayUtils.OrderListener() {
@Override
public void onPayResult(String payResult) {
PayResult pr = new PayResult(payResult);
String rs = pr.getResultStatus();
String r = pr.getResult();
switch (rs) {
case AliPayResultStatus.PAY_SUCCESS:
ToastUtils.show(R.string.pay_success);
//通知接口支付成功
break;
case AliPayResultStatus.PAY_PROCESSING:
case AliPayResultStatus.PAY_UNKNOWN:
ToastUtils.show(R.string.pay_fail);
//支付可能成功,要接口去查询
break;
default:
ToastUtils.show(R.string.pay_fail);
//通知接口支付失败,取消订单
}
}
});
上面方法中:
//通知接口支付成功 //支付可能成功,要接口去查询 //通知接口支付失败,取消订单。根据你产品需求要不要通知你服务器做的操作。正常是要的,用来改变订单状态
PayResult.class
public class PayResult {
private String resultStatus;
private String result;
private String memo;
public PayResult(String rawResult) {
if (TextUtils.isEmpty(rawResult))
return;
String[] resultParams = rawResult.split(";");
for (String resultParam : resultParams) {
if (resultParam.startsWith("resultStatus")) {
resultStatus = gatValue(resultParam, "resultStatus");
}
if (resultParam.startsWith("result")) {
result = gatValue(resultParam, "result");
}
if (resultParam.startsWith("memo")) {
memo = gatValue(resultParam, "memo");
}
}
}
@Override
public String toString() {
return "resultStatus={" + resultStatus + "};memo={" + memo
+ "};result={" + result + "}";
}
private String gatValue(String content, String key) {
String prefix = key + "={";
return content.substring(content.indexOf(prefix) + prefix.length(),
content.lastIndexOf("}"));
}
public String outOrder() {
String order = ""out_trade_no"";
if (result.contains(order)) {
String begin = result.substring(result.indexOf(order));
String ss = begin.split(",")[0];
String newS = ss.replace(""", "")
.replace("}", "")
.replace(":", "")
.replace("out_trade_no", "");
try {
return newS;
} catch (Exception e) {
e.printStackTrace();
}
}
return "";
}
/**
* @return the resultStatus
*/
public String getResultStatus() {
return resultStatus;
}
/**
* @return the memo
*/
public String getMemo() {
return memo;
}
/**
* @return the result
*/
public String getResult() {
return result;
}}
最后给下支付返回码表
AliPayResultStatus.class
public class AliPayResultStatus {
/**
* 订单支付成功,唯一肯定是支付成功的
*/
public static final String PAY_SUCCESS = "9000";
/**
* 正在处理中,支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态
*/
public static final String PAY_PROCESSING = "8000";
/**
* 订单支付失败
*/
public static final String PAY_FAIL = "4000";
/**
* 重复请求
*/
public static final String PAY_REPEAT = "5000";
/**
* 用户中途取消
*/
public static final String PAY_PROCESS_CANCEL = "6001";
/**
* 网络连接出错
*/
public static final String PAY_NET_ERROR = "6002";
/**
* 支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态
*/
public static final String PAY_UNKNOWN = "6004";}
还有一个直接弃用沙箱调试模式,否则提示支付失败也有可能不知道错在那,怕金额大,和接口商量,测试服务器就用0.01测试。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流