有没有结合支付宝第三方支付的国际支付第三方API

2015年2月 Java大版内专家分月排行榜第二2014年3月 Java大版内专家分月排行榜第二
2014年9月 Java大版内专家分月排行榜第三2014年6月 Java大版内专家分月排行榜第三2014年2月 Java大版内专家分月排行榜第三2013年11月 Java大版内专家分月排行榜第三2013年10月 Java大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。想在应用内接入第三方支付sdk,求推荐
有没有比较好的Android游戏应用内支付解决方案推荐?
在开发Android游戏。
现在有第三方公司封装的支付SDK,把多家渠道封装到一个包里。第三方公司要提成的。所以我们都是自己做的。
支付宝支付、微信支付、易宝支付、。。。
做这种金融类的,建议楼主在开发以后还是要去爱内测()做一个比较安全检测,这样会避免后期出现的漏洞被攻击的事情发生
你公司是什么类型的游戏?单机游戏还是网游?
哈哈,我们团队开发是用的bmob支付,很方便接入,也比较稳定,你们可以去试试3857人阅读
Android实例篇(7)
一.准备工作
1. 登录第三方支付宝开放平台
2. 开发前一定要阅读支付宝官方文档中心开发步骤
3. 下载相应的开发工具包(在文档中心&资源下载)
压缩包下的“支付宝钱包支付接口开发包”中即有Andoid使用支付宝的JAR和Demo
二.开发步骤
创建支付宝应用(管理中心&我的应用)
备注:申请通过后会获得:合作者身份ID(PID),该ID在项目配置中需要用到
完善信息(上传应用图标、说明文档)
配置应用环境
根据API文档详解进行配置(引用自API文档)
第一步 生成RSA密钥
特别注意事项(坑点)
下载支付宝的官网之后生成你所需要的密钥及PKCS8转码一定要小心
生成方式一(推荐):使用支付宝提供的一键生成工具(内附使用说明)
Windows:下载 (在API文档中点击下载)
MAC OSX:下载
解压打开文件夹,直接运行“支付宝RAS密钥生成器
SHAwithRSA.bat”(WINDOWS)
或“SHAwithRSA1024_mand”(MACOSX),点
击“生成RSA密钥”,会自动生成公私钥,然后点击“打开文件位
置”,即可找到工具自动生成的密钥。
注意:工具不支持含中文或空格的路径,请下载到英文目录下使用。
生成方式二:也可以使用OpenSSL工具命令生成(详细参考API)
开发者登录开放平台后,找到并进入应用。
点击“RSA(SHA1)密钥”处的“设置开发者公钥”(如已设置则显示“查看开发者公钥”,可修改),将公钥文件去除头尾、换行和空格,仅需填入字符串。
例如转换前公钥pem文件格式:
-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxLDkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unormYQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/QpkddCVXnZ4bAUaQjXQIDAQAB
-----END PUBLIC KEY-----
转换后得到的字符串为:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxLDkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unormYQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/QpkddCVXnZ4bAUaQjXQIDAQAB
第三步 获取支付宝公钥
应用上线后点击“查看支付宝公钥”,即可获取支付宝公钥,用于支付宝返回数据的验签。
对于支付宝公钥,看到的是一个字符串,如下:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB
如果需要使用文件方式(如使用服务端SDK的PHP/.NET版本)读取支付宝公钥,需要在头尾加入标示后保存至文件,文件内容如下:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB
-----END PUBLIC KEY-----
添加应用功能(详细参考API)
开发者在开发过程中,可以添加自己需要的功能到待申请功能列表。
上线应用的使用(详细参考API)
应用开发完成后,可申请上线,上线成功后,状态变为已上线,这个状态下的应用能够调用生产环境的接口。
AndroidManifest.xml 修改 (权限、界面、服务等申明)
android:minSdkVersion="4"
android:targetSdkVersion="8"
tools:ignore="OldTargetApi" /&
android:name="android.permission.INTERNET" /&
android:name="android.permission.ACCESS_NETWORK_STATE" /&
android:name="android.permission.ACCESS_WIFI_STATE" /&
android:name="android.permission.READ_PHONE_STATE" /&
android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&
android:anyDensity="true"
android:largeScreens="true"
android:normalScreens="true"
android:resizeable="true"
android:smallScreens="true" /&
android:allowBackup="true"
android:label="@string/app_name"
android:theme="@android:style/Theme.Light.NoTitleBar" &
android:name="com.alipay.sdk.pay.demo.PayDemoActivity"
android:icon="@drawable/msp_icon"
android:label="@string/app_name" &
android:name="android.intent.action.MAIN" /&
android:name="android.intent.category.LAUNCHER" /&
android:name="com.alipay.sdk.pay.demo.H5PayDemoActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" &
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation|screenSize"
android:exported="false"
android:screenOrientation="behind"
android:windowSoftInputMode="adjustResize|stateHidden" &
2.获取开发所需要的参数数据
PayDemoActivity主类
public class PayDemoActivity extends FragmentActivity {
public static final String PARTNER = "";
public static final String SELLER = "";
public static final String RSA_PRIVATE = "";
public static final String RSA_PUBLIC ="";
private static final int SDK_PAY_FLAG = 1;
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@SuppressWarnings("unused")
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
PayResult payResult = new PayResult((String) msg.obj);
* 同步返回的结果必须放置到服务端进行验证(验证的规则请看https://doc./doc2/
* detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
* docType=1) 建议商户依赖异步通知
String resultInfo = payResult.getResult();
String resultStatus = payResult.getResultStatus();
if (TextUtils.equals(resultStatus, "9000")) {
Toast.makeText(PayDemoActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
if (TextUtils.equals(resultStatus, "8000")) {
Toast.makeText(PayDemoActivity.this, "支付结果确认中", Toast.LENGTH_SHORT).show();
Toast.makeText(PayDemoActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pay_main);
* call alipay sdk pay. 调用SDK支付
public void pay(View v) {
if (TextUtils.isEmpty(PARTNER) || TextUtils.isEmpty(RSA_PRIVATE) || TextUtils.isEmpty(SELLER)) {
new AlertDialog.Builder(this).setTitle("警告").setMessage("需要配置PARTNER | RSA_PRIVATE| SELLER")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialoginterface, int i) {
}).show();
String orderInfo = getOrderInfo("测试的商品", "该测试商品的详细描述", "0.01");
* 特别注意,这里的签名逻辑需要放在服务端,切勿将私钥泄露在代码中!
String sign = sign(orderInfo);
* 仅需对sign 做URL编码
sign = URLEncoder.encode(sign, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
* 完整的符合支付宝参数规范的订单信息
final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType();
Runnable payRunnable = new Runnable() {
public void run() {
PayTask alipay = new PayTask(PayDemoActivity.this);
String result = alipay.pay(payInfo, true);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
mHandler.sendMessage(msg);
Thread payThread = new Thread(payRunnable);
payThread.start();
* get the sdk version. 获取SDK版本号
public void getSDKVersion() {
PayTask payTask = new PayTask(this);
String version = payTask.getVersion();
Toast.makeText(this, version, Toast.LENGTH_SHORT).show();
* 原生的H5(手机网页版支付切natvie支付) 【对应页面网页支付按钮】
public void h5Pay(View v) {
Intent intent = new Intent(this, H5PayDemoActivity.class);
Bundle extras = new Bundle();
* url是测试的网站,在app内部打开页面是基于webview打开的,demo中的webview是H5PayDemoActivity,
* demo中拦截url进行支付的逻辑是在H5PayDemoActivity中shouldOverrideUrlLoading方法实现,
* 商户可以根据自己的需求来实现
String url = "";
extras.putString("url", url);
intent.putExtras(extras);
startActivity(intent);
* create the order info. 创建订单信息
private String getOrderInfo(String subject, String body, String price) {
String orderInfo = "partner=" + "\"" + PARTNER + "\"";
orderInfo += "&seller_id=" + "\"" + SELLER + "\"";
orderInfo += "&out_trade_no=" + "\"" + getOutTradeNo() + "\"";
orderInfo += "&subject=" + "\"" + subject + "\"";
orderInfo += "&body=" + "\"" + body + "\"";
orderInfo += "&total_fee=" + "\"" + price + "\"";
orderInfo += "&notify_url=" + "\"" + "http://notify.msp.hk/notify.htm" + "\"";
orderInfo += "&service=\"mobile.securitypay.pay\"";
orderInfo += "&payment_type=\"1\"";
orderInfo += "&_input_charset=\"utf-8\"";
orderInfo += "&it_b_pay=\"30m\"";
orderInfo += "&return_url=\"\"";
return orderI
* get the out_trade_no for an order. 生成商户订单号,该值在商户端应保持唯一(可自定义格式规范)
private String getOutTradeNo() {
SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss", Locale.getDefault());
Date date = new Date();
String key = format.format(date);
Random r = new Random();
key = key + r.nextInt();
key = key.substring(0, 15);
* sign the order info. 对订单信息进行签名
待签名订单信息
private String sign(String content) {
return SignUtils.sign(content, RSA_PRIVATE);
* get the sign type we use. 获取签名方式
private String getSignType() {
return "sign_type=\"RSA\"";
3.跳转到支付页面
H5PayDemoActivity类
public class H5PayDemoActivity extends Activity {
private WebView mWebV
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle extras = null;
extras = getIntent().getExtras();
} catch (Exception e) {
if (extras == null) {
String url = null;
url = extras.getString("url");
} catch (Exception e) {
if (TextUtils.isEmpty(url)) {
new AlertDialog.Builder(H5PayDemoActivity.this).setTitle("警告")
.setMessage("必须配置需要打开的url 站点,请在PayDemoActivity类的h5Pay中配置")
.setPositiveButton("确定", new OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
}).show();
super.requestWindowFeature(Window.FEATURE_NO_TITLE);
LinearLayout layout = new LinearLayout(getApplicationContext());
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
layout.setOrientation(LinearLayout.VERTICAL);
setContentView(layout, params);
mWebView = new WebView(getApplicationContext());
params.weight = 1;
mWebView.setVisibility(View.VISIBLE);
layout.addView(mWebView, params);
WebSettings settings = mWebView.getSettings();
settings.setRenderPriority(RenderPriority.HIGH);
settings.setSupportMultipleWindows(true);
settings.setJavaScriptEnabled(true);
settings.setSavePassword(false);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setMinimumFontSize(settings.getMinimumFontSize() + 8);
settings.setAllowFileAccess(false);
settings.setTextSize(WebSettings.TextSize.NORMAL);
mWebView.setVerticalScrollbarOverlay(true);
mWebView.setWebViewClient(new MyWebViewClient());
mWebView.loadUrl(url);
public void onBackPressed() {
if (mWebView.canGoBack()) {
mWebView.goBack();
public void finish() {
super.finish();
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
private class MyWebViewClient extends WebViewClient {
public boolean shouldOverrideUrlLoading(final WebView view, String url) {
if (!(url.startsWith("http") || url.startsWith("https"))) {
return true;
final PayTask task = new PayTask(H5PayDemoActivity.this);
final String ex = task.fetchOrderInfoFromH5PayUrl(url);
if (!TextUtils.isEmpty(ex)) {
System.out.println("paytask:::::" + url);
new Thread(new Runnable() {
public void run() {
System.out.println("payTask:::" + ex);
final H5PayResultModel result = task.h5Pay(ex, true);
if (!TextUtils.isEmpty(result.getReturnUrl())) {
H5PayDemoActivity.this.runOnUiThread(new Runnable() {
public void run() {
view.loadUrl(result.getReturnUrl());
}).start();
view.loadUrl(url);
return true;
protected void onDestroy() {
super.onDestroy();
if (mWebView != null) {
mWebView.removeAllViews();
mWebView.destroy();
} catch (Throwable t) {
mWebView = null;
4.其它的工具类,原封不动拷贝过去就好(参考demo)
SignUtils类
PayResult类
开发流程:
下载API开发文档后,即可获取官方Demo,该Demo中需要将审核通过后获取的PID替换,并且输入支付宝收款账户即可。
官方Api开发文档中,存在一个openssl的文件夹,该文件夹主要是用于生成支付宝所需要用到的公钥以及私钥。打开该文件夹可以看到详细的生成方式,根据提示生成公钥及私钥,请注意,密钥需要经过pkcs8二次加密。
将生成的公钥和私钥配置到Demo中。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:9576次
排名:千里之外
原创:27篇
(2)(4)(7)(4)(11)(4)第三方支付宝API应用流程
一.准备工作
1. 登录第三方支付宝开放平台
2. 开发前一定要支付宝官方文档中心开发步骤
3. 下载相应的开发工具包(在文档中心&资源下载)
压缩包下的&支付宝钱包支付接口开发包&中即有Andoid使用支付宝的JAR和Demo
二.开发步骤
创建支付宝应用(管理中心&我的应用)
备注:申请通过后会获得:合作者身份ID(PID),该ID在项目配置中需要用到
完善信息(上传应用图标、说明文档) 配置应用环境
根据API文档详解进行配置(引用自API文档)
第一步 生成RSA密钥
特别注意事项(坑点)
下载支付宝的官网之后生成你所需要的密钥及PKCS8转码一定要小心
生成方式一(推荐):使用支付宝提供的一键生成工具(内附使用说明)
Windows:下载 (在API文档中点击下载)
MAC OSX:下载
解压打开文件夹,直接运行&支付宝RAS密钥生成器
SHAwithRSA.bat&(WINDOWS)
或&SHAwithRSA1024_mand&(MACOSX),点
击&生成RSA密钥&,会自动生成公私钥,然后点击&打开文件位
置&,即可找到工具自动生成的密钥。
注意:工具不支持含中文或空格的路径,请下载到英文目录下使用。
生成方式二:也可以使用OpenSSL工具命令生成(详细参考API)
开发者登录开放平台后,找到并进入应用。
点击&RSA(SHA1)密钥&处的&设置开发者公钥&(如已设置则显示&查看开发者公钥&,可修改),将公钥文件去除头尾、换行和空格,仅需填入字符串。
例如转换前公钥pem文件格式:
-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxLDkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unormYQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/QpkddCVXnZ4bAUaQjXQIDAQAB
-----END PUBLIC KEY-----
转换后得到的字符串为:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxLDkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unormYQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/QpkddCVXnZ4bAUaQjXQIDAQAB
第三步 获取支付宝公钥
应用上线后点击&查看支付宝公钥&,即可获取支付宝公钥,用于支付宝返回数据的验签。
对于支付宝公钥,看到的是一个字符串,如下:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB
如果需要使用文件方式(如使用服务端SDK的/.NET版本)读取支付宝公钥,需要在头尾加入标示后保存至文件,文件内容如下:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB
-----END PUBLIC KEY-----
添加应用功能(详细参考API)
开发者在开发过程中,可以添加自己需要的功能到待申请功能列表。
。。。 上线应用的使用(详细参考API)
应用开发完成后,可申请上线,上线成功后,状态变为已上线,这个状态下的应用能够调用生产环境的接口。
Manifest.xml 修改 (权限、界面、服务等申明)
2.获取开发所需要的参数数据
PayDemoActivity主类
public class PayDemoActivity extends FragmentActivity {
// 商户PID
public static final String PARTNER = &&;
// 商户收款账号
public static final String SELLER = &&;
// 商户私钥,pkcs8格式
public static final String RSA_PRIVATE = &&;
// 支付宝公钥
public static final String RSA_PUBLIC =&&;
private static final int SDK_PAY_FLAG = 1;
@SuppressLint(&HandlerLeak&)
private Handler mHandler = new Handler() {
@SuppressWarnings(&unused&)
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
PayResult payResult = new PayResult((String) msg.obj);
* 同步返回的结果必须放置到服务端进行验证(验证的规则请看https://doc./doc2/
* detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
* docType=1) 建议商户依赖异步通知
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为&9000&则代表支付成功,具体状态码代表含义可参考接口文档
if (TextUtils.equals(resultStatus, &9000&)) {
Toast.makeText(PayDemoActivity.this, &支付成功&, Toast.LENGTH_SHORT).show();
// 判断resultStatus 为非&9000&则代表可能支付失败
// &8000&代表支付结果因为支付渠道原因或者原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
if (TextUtils.equals(resultStatus, &8000&)) {
Toast.makeText(PayDemoActivity.this, &支付结果确认中&, Toast.LENGTH_SHORT).show();
// 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
Toast.makeText(PayDemoActivity.this, &支付失败&, Toast.LENGTH_SHORT).show();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pay_main);
* call alipay sdk pay. 调用SDK支付
public void pay(View v) {
if (TextUtils.isEmpty(PARTNER) || TextUtils.isEmpty(RSA_PRIVATE) || TextUtils.isEmpty(SELLER)) {
new AlertDialog.Builder(this).setTitle(&警告&).setMessage(&需要配置PARTNER | RSA_PRIVATE| SELLER&)
.setPositiveButton(&确定&, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialoginterface, int i) {
}).show();
String orderInfo = getOrderInfo(&测试的商品&, &该测试商品的详细描述&, &0.01&);
* 特别注意,这里的签名逻辑需要放在服务端,切勿将私钥泄露在代码中!
String sign = sign(orderInfo);
* 仅需对sign 做URL编码
sign = URLEncoder.encode(sign, &UTF-8&);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
* 完整的符合支付宝参数规范的订单信息
final String payInfo = orderInfo + &&sign=\&& + sign + &\&&& + getSignType();
Runnable payRunnable = new Runnable() {
public void run() {
// 构造PayTask 对象
PayTask alipay = new PayTask(PayDemoActivity.this);
// 调用支付接口,获取支付结果
String result = alipay.pay(payInfo, true);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
mHandler.sendMessage(msg);
// 必须异步调用
Thread payThread = new Thread(payRunnable);
payThread.start();
* get the sdk version. 获取SDK版本号
public void getSDKVersion() {
PayTask payTask = new PayTask(this);
String version = payTask.getVersion();
Toast.makeText(this, version, Toast.LENGTH_SHORT).show();
* 原生的H5(手机网页版支付切natvie支付) 【对应页面网页支付按钮】
* @param v
public void h5Pay(View v) {
Intent intent = new Intent(this, H5PayDemoActivity.class);
Bundle extras = new Bundle();
* url是测试的网站,在app内部打开页面是基于webview打开的,demo中的webview是H5PayDemoActivity,
* demo中拦截url进行支付的逻辑是在H5PayDemoActivity中shouldOverrideUrlLoading方法实现,
* 商户可以根据自己的需求来实现
String url = &&;
// url可以是一号店或者淘宝等第三方的购物wap站点,在该网站的支付过程中,支付宝sdk完成拦截支付
extras.putString(&url&, url);
intent.putExtras(extras);
startActivity(intent);
* create the order info. 创建订单信息
private String getOrderInfo(String subject, String body, String price) {
// 签约合作者身份ID
String orderInfo = &partner=& + &\&& + PARTNER + &\&&;
// 签约卖家支付宝账号
orderInfo += &&seller_id=& + &\&& + SELLER + &\&&;
// 商户网站唯一订单号
orderInfo += &&out_trade_no=& + &\&& + getOutTradeNo() + &\&&;
// 商品名称
orderInfo += &&subject=& + &\&& + subject + &\&&;
// 商品详情
orderInfo += &&body=& + &\&& + body + &\&&;
// 商品金额
orderInfo += &&total_fee=& + &\&& + price + &\&&;
// 服务器异步通知页面路径
orderInfo += &&ify_url=& + &\&& + &http://notify.msp.hk/notify.htm& + &\&&;
// 服务接口名称, 固定值
orderInfo += &&service=\&mobile.securitypay.pay\&&;
// 支付类型, 固定值
orderInfo += &&payment_type=\&1\&&;
// 参数编码, 固定值
orderInfo += &&_input_charset=\&utf-8\&&;
// 设置未付款交易的超时时间
// 默认30分钟,一旦超时,该笔交易就会自动被关闭。
// 取值范围:1m~15d。
// m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。
// 该参数数值不接受小数点,如1.5h,可转换为90m。
orderInfo += &&it_b_pay=\&30m\&&;
// extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
// orderInfo += &&extern_token=& + &\&& + extern_token + &\&&;
// 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空
orderInfo += &&return_url=\&\&&;
// 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)
// orderInfo += &&paymethod=\&expressGateway\&&;
return orderI
* get the out_trade_no for an order. 生成商户订单号,该值在商户端应保持唯一(可自定义格式规范)
private String getOutTradeNo() {
SimpleDateFormat format = new SimpleDateFormat(&MMddHHmmss&, Locale.getDefault());
Date date = new Date();
String key = format.format(date);
Random r = new Random();
key = key + r.nextInt();
key = key.substring(0, 15);
* sign the order info. 对订单信息进行签名
* @param content
待签名订单信息
private String sign(String content) {
return SignUtils.sign(content, RSA_PRIVATE);
* get the sign type we use. 获取签名方式
private String getSignType() {
return &sign_type=\&RSA\&&;
3.跳转到支付页面
H5PayDemoActivity类
public class H5PayDemoActivity extends Activity {
private WebView mWebV
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle extras =
extras = getIntent().getExtras();
} catch (Exception e) {
if (extras == null) {
String url =
url = extras.getString(&url&);
} catch (Exception e) {
if (TextUtils.isEmpty(url)) {
// 测试H5支付,必须设置要打开的url网站
new AlertDialog.Builder(H5PayDemoActivity.this).setTitle(&警告&)
.setMessage(&必须配置需要打开的url 站点,请在PayDemoActivity类的h5Pay中配置&)
.setPositiveButton(&确定&, new OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
}).show();
super.requestWindowFeature(Window.FEATURE_NO_TITLE);
LinearLayout layout = new LinearLayout(getApplicationContext());
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
layout.setOrientation(LinearLayout.VERTICAL);
setContentView(layout, params);
mWebView = new WebView(getApplicationContext());
params.weight = 1;
mWebView.setVisibility(View.VISIBLE);
layout.addView(mWebView, params);
WebSettings settings = mWebView.getSettings();
settings.setRenderPriority(RenderPriority.HIGH);
settings.setSupportMultipleWindows(true);
settings.setScriptEnabled(true);
settings.setSavePassword(false);
settings.setCanOpenWindowsAutomatically(true);
settings.setMinimumFontSize(settings.getMinimumFontSize() + 8);
settings.setAllowFileAccess(false);
settings.setTextSize(WebSettings.TextSize.NORMAL);
mWebView.setVerticalScrollbarOverlay(true);
mWebView.setWebViewClient(new MyWebViewClient());
mWebView.loadUrl(url);
public void onBackPressed() {
if (mWebView.canGoBack()) {
mWebView.goBack();
public void finish() {
super.finish();
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
private class MyWebViewClient extends WebViewClient {
public boolean shouldOverrideUrlLoading(final WebView view, String url) {
if (!(url.startsWith(&http&) || url.startsWith(&https&))) {
final PayTask task = new PayTask(H5PayDemoActivity.this);
final String ex = task.fetchOrderInfoFromH5PayUrl(url);
if (!TextUtils.isEmpty(ex)) {
System.out.println(&paytask:::::& + url);
new Thread(new Runnable() {
public void run() {
System.out.println(&payTask:::& + ex);
final H5PayResultModel result = task.h5Pay(ex, true);
if (!TextUtils.isEmpty(result.getReturnUrl())) {
H5PayDemoActivity.this.runOnUiThread(new Runnable() {
public void run() {
view.loadUrl(result.getReturnUrl());
}).start();
view.loadUrl(url);
protected void onDestroy() {
super.onDestroy();
if (mWebView != null) {
mWebView.removeAllViews();
mWebView.destroy();
} catch (Throwable t) {
mWebView =
4.其它的工具类,原封不动拷贝过去就好(参考demo)
SignUtils类
PayResult类
开发流程:
下载API开发文档后,即可获取官方Demo,该Demo中需要将审核通过后获取的PID替换,并且输入支付宝收款账户即可。
官方Api开发文档中,存在一个openssl的文件夹,该文件夹主要是用于生成支付宝所需要用到的公钥以及私钥。打开该文件夹可以看到详细的生成方式,根据提示生成公钥及私钥,请注意,密钥需要经过pkcs8二次。
将生成的公钥和私钥配置到Demo中。}

我要回帖

更多关于 支付宝api 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信